Qt:玩转QPainter序列二

news2024/9/24 19:24:45

前言

接着序列一开始序列二。

正文

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

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.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2070857.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SD 卡无法读取?这十大方法助你轻松修复!

在我们的日常生活中&#xff0c;SD 卡被广泛应用于各种设备&#xff0c;如数码相机、手机、平板电脑等。然而&#xff0c;有时我们可能会遇到 SD 卡无法读取的情况&#xff0c;这让人十分苦恼。别担心&#xff0c;下面为你介绍多种修复 SD 卡无法读取问题的方法。 一、检查硬件…

如何知道当前网卡连接的下位机的IP,通过工具实现

要确定当前网卡连接的下位机的 IP 地址&#xff0c;可以使用以下几种工具和方法来实现。 1. 使用 arp-scan 工具 arp-scan 是一个强大的网络扫描工具&#xff0c;可以用于扫描网络上的设备并显示它们的 IP 和 MAC 地址。 安装 arp-scan&#xff1a; sudo apt update sudo a…

合宙LuatOS开发板使用说明——Air700ECQ

EVB-Air700ECQ-IO 开发板是合宙通信推出的基于 Air700ECQ 模组所开发的&#xff0c;包含电 源&#xff0c; SIM 卡&#xff0c;USB &#xff0c;天 线&#xff0c; 全 IO 引 出的最 小硬 件系 统。以 方便 用户 在设 计前期 对 Air700ECQ 模块进行性能评估&#xff0c;功能调试…

AutoMapperSQL

AutoMapperSQL--Mybatis实用小工具&#xff1a;根据数据模型、数据访问接口自动生成 mysql、sql server、oracle 三种数据源类型的表脚本及mybatis接口类对应的mapper-xml文件。 1、指定数据访问接口 mapper interface 目录路径&#xff1b; 2、指定数据模型目录路径&#xff1…

机器学习-OpenCV运用(1)

文章目录 一、OpenCV介绍二、OpenCV运用1.读取保存图片2.读取视频3.图像切片 一、OpenCV介绍 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库&#xff0c;它主要用于实时的图像处理和计算机视觉任务。虽然OpenCV本…

ARM架构与ARM内核

参考&#xff1a;https://blog.csdn.net/qq_34160841/article/details/105611131 到底什么是Cortex、ARMv8、arm架构、ARM指令集、soc&#xff1f;一文帮你梳理基础概念 认识ARM、Cortex-M内核&#xff0c;以及ARMv8-M架构 ARM架构 ARM的架构指的是ARM的指令集架构。ARM指令集…

基于WordPress搭建的写真网站整站打包代码,可直接运营

直接服务器整站源码数据库打包了。 这个包的资源非常多&#xff0c;也非常火爆&#xff0c;吸引力还是挺大的。用这个架设一个引流网站还是轻松的。 图片太多太敏感&#xff0c;就不在这里显示了&#xff0c;懂的都懂。 代码测试过了&#xff0c;运行是完全没问题的。已经好…

CSS学习【margin为负值】

目录 margin塌陷时合并规则 margin重叠概念 可能会发生的情况 外边距重叠计算规则 兄弟元素之间合并&#xff0c;都为负值 当“.box1”和“.box2”都未设置外间距时&#xff1a; 给“.box1”和“.box2”设置外间距后&#xff1a; 兄弟元素间合并&#xff0c;一正一负 …

深入解析SSRF和Redis未授权访问

深入解析SSRF和Redis未授权访问&#xff1a;漏洞分析与防御 在网络安全领域&#xff0c;服务器端请求伪造&#xff08;SSRF&#xff09; 和 Redis未授权访问 是两类常见且危险的安全漏洞。 1.2 SSRF攻击的利用 1.2.1 测试并确认SSRF漏洞 一个典型的例子是&#xff0c;当应用…

迭代器的失效问题

vector的插入与删除 我们首先举例说明vector插入和删除操作返回的是什么迭代器 void print(std::vector<int>& vec) {for(auto itvec.begin();it!vec.end();it)std::cout<<*it<<" ";std::cout<<std::endl; }void test() {/*初始化vect…

Simple RPC - 07 从零开始设计一个服务端(下)_RPC服务的实现

文章目录 PreRPC服务实现服务注册请求处理 设计&#xff1a; 请求分发机制 Pre Simple RPC - 01 框架原理及总体架构初探 Simple RPC - 02 通用高性能序列化和反序列化设计与实现 Simple RPC - 03 借助Netty实现异步网络通信 Simple RPC - 04 从零开始设计一个客户端&#…

【数据结构】堆主要的应用场景

1. 堆排序 所谓堆排序&#xff0c;就是在堆的基础上进行排序。 在讲解堆排序之前&#xff0c;让我们先来回顾一下堆的概念&#xff0c; 1.1 大根堆和小根堆 堆是一种完全二叉树&#xff0c;它有两种形式&#xff0c;一种是大根堆&#xff0c;另外一种是小根堆。 大根堆&…

2023年看过的电影和电视剧

2023年看过的电影 2023年12月21日&#xff1a;三大队 评价&#xff1a;感觉结尾不太突出&#xff0c;但是值得一看。 2023年10月02日&#xff1a;志愿军&#xff1a;雄兵出击 评价&#xff1a;感觉还行&#xff0c;场面还不错。但是记不得太多情节。 2023年08月31日&#xf…

如何将 Parallels Desktop 许可证密钥移至新的 Mac?

根据 Parallels 最终用户许可协议&#xff08;EULA&#xff09;的规定&#xff0c;您最多可以在一台设备上下载、安装和使用 Parallels Desktop 的一个原始副本。但是面对更换新机的用户&#xff0c;可以通过迁移的方式把 Parallels Desktop 许可证密钥移至新的 Mac&#xff0c…

跟《经济学人》学英文:2024年08月24日这期 What to make of America’s topsy-turvy economy

What to make of America’s topsy-turvy economy Don’t panic just yet topsy-turvy&#xff1a;颠倒的&#xff1b;混乱的&#xff1b;乱七八糟的&#xff1b; make of&#xff1a;理解&#xff1b;认为&#xff1b;看待 Make of: 这里的 “make of” 意思是如何理解或解释…

自来水厂供水监控的串口服务器应用

随着城市化进程的加快和人口的不断增长&#xff0c;自来水厂作为城市供水系统的核心组成部分&#xff0c;其稳定性和安全性对于城市的正常运行和居民的生活质量至关重要。传统的供水监控系统存在数据传输效率低、维护成本高、实时性差等问题&#xff0c;难以满足现代城市对供水…

TMDOG的微服务之路_08——使用Docker部署NestJS微服务

TMDOG的微服务之路_08——使用Docker部署NestJS微服务 博客地址&#xff1a;TMDOG的博客 在上一篇博客中&#xff0c;我们探讨了如何使用 NestJS 创建一个简单的微服务架构。为了将这些微服务部署到生产环境&#xff0c;我们可以使用 Docker 来打包和管理这些服务。本篇博客将…

Docker 数据卷的使用

Docker 数据卷的使用 文章目录 Docker 数据卷的使用导引1. 创建数据卷2. 查看创建的数据卷3. 查看数据卷的详细信息 导引 在Docker中&#xff0c;我们在创建并运行容器后&#xff0c;可以通过exec命令进入容器内部进行操作&#xff0c;但会发现一些命令是无法使用的&#xff0…

NSSCTF练习记录:[SWPUCTF 2021 新生赛]pigpig

题目&#xff1a; 根据题目名字和附件名提示&#xff0c;猜测为猪圈密码&#xff0c;对应手动解码 whenthepigwanttoeat

持久层接口开发

通常一个接口定义后&#xff0c;从持久层开始开发。 对于一个新模块需要使用工具生成模型类、mapper接口、mapper映射文件等&#xff0c;下边介绍一个工具用于自动生成代码。 1. 代码生成工具 1.1 安装插件 1.2 重启IDEA&#xff0c;连接mysql 1.3 配置代码生成规则 点击“c…