Qt:玩转QPainter序列二

2024-08-24 18:52
文章标签 qt 玩转 序列 qpainter

本文主要是介绍Qt:玩转QPainter序列二,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

接着序列一开始序列二。

正文

继续先看源码,下面是分析
在这里插入图片描述

1. Q_FLAG(RenderHint)

Q_FLAG是Qt宏,用于向Qt的元对象系统(Meta-Object System)注册枚举值,以便可以在Qt的元对象系统中使用这些枚举值。例如,它们可以在Qt的对象树视图中显示,或在Qt的属性系统中使用。

RenderHint 是一个枚举类型,Q_FLAG(RenderHint)告诉Qt,这个枚举类型可以被元对象系统识别。

2. Q_DECLARE_FLAGS(RenderHints, RenderHint)

Q_DECLARE_FLAGS是一个宏,用于创建一个新的类型,表示给定枚举类型的组合。这个宏会定义一个RenderHints类型,它是RenderHint枚举的位掩码组合(bitmask)。

具体解释:

  • RenderHint 是一个枚举类型,它定义了多个枚举值。
  • Q_DECLARE_FLAGS(RenderHints, RenderHint) 创建了一个类型RenderHints,它可以容纳一个或多个RenderHint的组合。

这个新类型RenderHints将会是一个QFlags类,它允许通过按位或运算符将多个枚举值组合在一起。

3. Q_FLAG(RenderHints)

Q_FLAG(RenderHint)类似,Q_FLAG(RenderHints)是对RenderHints类型进行注册,确保它可以被Qt的元对象系统识别。

4. PixmapFragment类及其成员

PixmapFragment是一个简单的C++类,包含了一些表示图像碎片的属性。它有一个静态方法create,用于创建一个PixmapFragment对象。该方法接收碎片位置、源矩形、缩放、旋转和透明度等参数。

5. PixmapFragmentHint 枚举

PixmapFragmentHint是一个枚举类型,当前只定义了一个枚举值OpaqueHint,其值为0x01
OpaqueHint = 0x01: 表示这个片段是不透明的。这可以用来优化渲染过程,例如避免对不透明区域进行多余的透明度处理。

6. Q_DECLARE_FLAGS(PixmapFragmentHints, PixmapFragmentHint)

同样的,这一行使用Q_DECLARE_FLAGS宏创建了一个名为PixmapFragmentHints的新类型,允许组合PixmapFragmentHint枚举类型的多个值。

7. QPainter 类

QPainter类用于在设备(如窗口、图像)上执行绘图操作。它有几个构造函数和成员函数用于管理绘图的开始和结束。

  • QPainter():默认构造函数。
  • explicit QPainter(QPaintDevice *):构造函数,用于将QPainter与一个QPaintDevice关联起来。
  • ~QPainter():析构函数。
  • QPaintDevice *device() const;:返回当前绘图设备。
  • bool begin(QPaintDevice *);:开始在设备上绘图。
  • bool end();:结束绘图。
  • bool isActive() const;:返回QPainter是否处于激活状态。

8. Qt 过时的标记 QT_DEPRECATED_SINCE(5, 13)

这段代码的作用是处理Qt中的过时函数。在Qt开发中,某些函数随着新版本的发布可能会被标记为“过时”或“不推荐使用”,以便开发者逐渐迁移到新的替代方案。

1. #if QT_DEPRECATED_SINCE(5, 13)
  • 这是一条条件编译指令,检查是否定义了QT_DEPRECATED_SINCE(5, 13)
  • 如果Qt版本是5.13或更高版本,并且这个宏被定义了,下面的代码块将会被编译。如果版本低于5.13,或者宏未定义,那么该代码块将被忽略,不会被编译。
2. QT_DEPRECATED_X("Use begin(QPaintDevice*) instead")
  • 这是一个宏,用于标记一个函数或方法为“过时”。
  • QT_DEPRECATED_X允许你指定一条消息,如这里的"Use begin(QPaintDevice*) instead",这条消息将在编译器发出警告时显示,提示开发者这个函数已经过时,并建议使用替代方法。
  • 在这种情况下,initFrom(const QPaintDevice *device)方法被标记为过时,建议使用begin(QPaintDevice*)方法来代替。
3. void initFrom(const QPaintDevice *device);
  • 这是被标记为过时的方法。它的作用是初始化一个QPainter对象,使其从一个指定的QPaintDevice对象中进行初始化。
  • 因为这个方法已经被Qt官方标记为不推荐使用,所以开发者应该避免在新的代码中使用它。
4. #endif
  • 结束#if条件编译指令的代码块。

例子

下面列举一个小例子来使用这些方法

void PlayQPainter::paintEvent(QPaintEvent* event)
{// 测试QPainter()构造函数QPainter painter;// 测试begin(QPaintDevice*)方法if (painter.begin(this)){qDebug() << "QPainter started.";// 测试isActive()方法if (painter.isActive()){qDebug() << "QPainter is active.";// 使用painter绘制一个矩形painter.drawRect(10, 10, 100, 100);// 测试device()方法QPaintDevice* device = painter.device();if (device == this){qDebug() << "Painter is painting on the correct device.";}}// 测试end()方法painter.end();qDebug() << "QPainter ended.";}else{qDebug() << "Failed to start QPainter.";}
}

运行结果

QPainter started.
QPainter is active.
Painter is painting on the correct device.
QPainter ended.
QPainter started.
QPainter is active.
Painter is painting on the correct device.
QPainter ended.
QPainter started.
QPainter is active.
Painter is painting on the correct device.
QPainter ended.

这篇关于Qt:玩转QPainter序列二的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1103313

相关文章

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Qt中QGroupBox控件的实现

《Qt中QGroupBox控件的实现》QGroupBox是Qt框架中一个非常有用的控件,它主要用于组织和管理一组相关的控件,本文主要介绍了Qt中QGroupBox控件的实现,具有一定的参考价值,感兴趣... 目录引言一、基本属性二、常用方法2.1 构造函数 2.2 设置标题2.3 设置复选框模式2.4 是否

QT进行CSV文件初始化与读写操作

《QT进行CSV文件初始化与读写操作》这篇文章主要为大家详细介绍了在QT环境中如何进行CSV文件的初始化、写入和读取操作,本文为大家整理了相关的操作的多种方法,希望对大家有所帮助... 目录前言一、CSV文件初始化二、CSV写入三、CSV读取四、QT 逐行读取csv文件五、Qt如何将数据保存成CSV文件前言

Qt中QUndoView控件的具体使用

《Qt中QUndoView控件的具体使用》QUndoView是Qt框架中用于可视化显示QUndoStack内容的控件,本文主要介绍了Qt中QUndoView控件的具体使用,具有一定的参考价值,感兴趣的... 目录引言一、QUndoView 的用途二、工作原理三、 如何与 QUnDOStack 配合使用四、自

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

Qt 中 isHidden 和 isVisible 的区别与使用小结

《Qt中isHidden和isVisible的区别与使用小结》Qt中的isHidden()和isVisible()方法都用于查询组件显示或隐藏状态,然而,它们有很大的区别,了解它们对于正确操... 目录1. 基础概念2. 区别清见3. 实际案例4. 注意事项5. 总结1. 基础概念Qt 中的 isHidd

QT移植到RK3568开发板的方法步骤

《QT移植到RK3568开发板的方法步骤》本文主要介绍了QT移植到RK3568开发板的方法步骤,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录前言一、获取SDK1. 安装依赖2. 获取SDK资源包3. SDK工程目录介绍4. 获取补丁包二

Qt把文件夹从A移动到B的实现示例

《Qt把文件夹从A移动到B的实现示例》本文主要介绍了Qt把文件夹从A移动到B的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录如何移动一个文件? 如何移动文件夹(包含里面的全部内容):如何删除文件夹:QT 文件复制,移动(