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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值