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 实现绘图。

相关推荐
q5673152313 分钟前
在 Bash 中获取 Python 模块变量列
开发语言·python·bash
阿伟来咯~24 分钟前
记录学习react的一些内容
javascript·学习·react.js
许野平38 分钟前
Rust: 利用 chrono 库实现日期和字符串互相转换
开发语言·后端·rust·字符串·转换·日期·chrono
也无晴也无风雨42 分钟前
在JS中, 0 == [0] 吗
开发语言·javascript
Suckerbin1 小时前
Hms?: 1渗透测试
学习·安全·网络安全
狂奔solar1 小时前
yelp数据集上识别潜在的热门商家
开发语言·python
水豚AI课代表1 小时前
分析报告、调研报告、工作方案等的提示词
大数据·人工智能·学习·chatgpt·aigc
聪明的墨菲特i1 小时前
Python爬虫学习
爬虫·python·学习
Diamond技术流1 小时前
从0开始学习Linux——网络配置
linux·运维·网络·学习·安全·centos
斑布斑布1 小时前
【linux学习2】linux基本命令行操作总结
linux·运维·服务器·学习