Qt 绘图(学习记录)

1. QT 绘图中创建画家类 QPainter提供了高度优化的功能,以完成大多数绘图GUI程序所需的功能。它可以画任何东西,从简单的线条到复杂的形状,如馅饼和和弦。它还可以绘制对齐的文本和像素图。通常,它绘制一个"自然"坐标系,但它也可以做视图和世界转换。QPainter可以对继承QPaintDevice类的任何对象进行操作。

其中

QT绘图

要在QT中绘图,你可以使用QPainter类。QPainter提供了一种很直观的方式来在QT应用程序中绘图。

以下是一些基本的绘图示例:

  1. 绘制直线

void MyWidget::paintEvent(QPaintEvent *event)

{

QPainter painter(this);

painter.drawLine(0, 0, 100, 100);

}

绘制矩形:

void MyWidget::paintEvent(QPaintEvent *event)

{

QPainter painter(this);

painter.drawRect(10, 10, 100, 50);

}

  1. 绘制圆形:

void MyWidget::paintEvent(QPaintEvent *event)

{

QPainter painter(this);

painter.drawEllipse(10, 10, 100, 50);

}

填充颜色:

void MyWidget::paintEvent(QPaintEvent *event)

{

QPainter painter(this);

painter.fillRect(10, 10, 100, 50, Qt::red);

}
绘制文本

void MyWidget::paintEvent(QPaintEvent *event)

{

QPainter painter(this);

painter.drawText(50, 50, "Hello, World!");

}

绘制图像:

void MyWidget::paintEvent(QPaintEvent *event)

{

QPainter painter(this);

QImage image(":/image.png");

painter.drawImage(10, 10, image);

}

其中

图设备是指继承 QPaintDevice 的子类,你可以使用 QPainter 直接在其上面绘制图形,Qt 一共提供了四个这样继承 QPaintDevice 的绘图设备类,分别是:QPixmap、QBitmap、QImage和 QPicture。其中:

QPixmap专门为图像在屏幕上的显示做了优化;
QBitmap是 QPixmap 的一个子类,它的色深限定为 1,你可以使用 QPixmap 的 isQBitmap() 函数来确定这个 QPixmap 是不是一个 QBitmap;
QImage专门为图像的像素级访问做了优化;
QPicture则可以记录和重现

QPainter 的各条命令
QImage与pixmap的区别

1、QPixmap 主要是用于绘图,针对屏幕显示而最佳化设计,QImage 主要是为图像 I/O、图片访问和像素修改而设计的。

2、QPixmap 依赖于所在的平台的绘图引擎,故例如反锯齿等一些效果在不同的平台上可能会有不同的显示效果,QImage 使用 Qt 自身的绘图引擎,可在不同平台上具有相同的显示效果。

3、目前的 Qt 会把 QPixmap 都存储在 graphics memory 中,QImage 是存储在客户端的,是独立于硬件的。在 X11, Mac 以及 Symbian平台上,QPixmap 是存储在服务器端,而 QImage 则是存储在客户端,所以 QPixmap 上绘图比较慢,但显示它则比较快。但在 Windows 平台上,QPixmap 和 QImage 都是存储在客户端,并不使用任何的 GDI 资源,所以可能看起来并没有多大区别。
4、由于 QImage 是独立于硬件的,也是一种 QPaintDevice,因此我们可以在另一个线程中对其进行绘制,而不需要在 GUI 线程中处理,使用这一方式可以很大幅度提高 UI 响应速度。而 QPixmap 不可以使用在子线程中加载图片。

5、QImage 可通过 setPixpel() 和 pixel() 等方法直接存取指定的像素。

当图片小的情况下,直接用 QPixmap 进行加载,画图时无所谓,当图片大的时候如果直接用 QPixmap 进行加载,会占很大的内存,一般一张几十 K 的图片,用 QPixmap 加载进来会放大很多倍,所以一般图片大的情况下,用 QImage 进行加载,然后转成 QPixmap 绘制。QPixmap 绘制性能是最好的。

所以当绘画大图片时候,此时最好先使用 QImage 进行加载,因为 QImage 本身主要是为图像 I/O、图片访问和像素修改而设计的,它可以实现对图片旋转、缩放等。然后通过 QPixmap 实现绘图。

相关推荐
酷在前行1 小时前
【R生态】PERMANOVA 进阶实战:距离选择、PERMDISP、两两比较与受限置换(保姆级教程)
开发语言·r语言
MartinYeung51 小时前
[论文学习]OSReward:为跨平台计算机使用奖励模型建立标准化评估
人工智能·学习
dong1326971 小时前
Agent Skills学习笔记
笔记·学习
cxr8281 小时前
Graphify vs GitNexus vs CodeGraph — 三工具架构深度对比
开发语言·架构·知识图谱
for_ever_love__2 小时前
iOS:网络请求再学习
网络·学习·ios·objective-c
世人万千丶2 小时前
鸿蒙Crash高级捕获与异常监控:全局异常兜底/崩溃栈解析/符号表还原/智能聚类/闭环修复
学习·机器学习·华为·数据挖掘·harmonyos·鸿蒙·聚类
废弃的小码农2 小时前
功能测试--Day07--Python编程基础
开发语言·python
Jul1en_2 小时前
【Claude Code Compact】源码级别的学习上下文压缩
java·前端·学习·github·ai编程
fengci.3 小时前
Microweber CMS 未授权路径穿越漏洞(CVE-2026-65694)
android·开发语言·前端·学习·php
程序员zgh3 小时前
C++ 拷贝赋值运算符 详解
c语言·开发语言·c++