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

相关推荐
每次的天空11 分钟前
Android-自定义View的实战学习总结
android·学习·kotlin·音视频
苦夏木禾13 分钟前
js请求避免缓存的三种方式
开发语言·javascript·缓存
重庆小透明18 分钟前
力扣刷题记录【1】146.LRU缓存
java·后端·学习·算法·leetcode·缓存
超级土豆粉21 分钟前
Turndown.js: 优雅地将 HTML 转换为 Markdown
开发语言·javascript·html
wei_shuo1 小时前
飞算 JavaAI 开发助手:深度学习驱动下的 Java 全链路智能开发新范式
java·开发语言·飞算javaai
熊猫钓鱼>_>1 小时前
用Python解锁图像处理之力:从基础到智能应用的深度探索
开发语言·图像处理·python
GO兔2 小时前
开篇:GORM入门——Go语言的ORM王者
开发语言·后端·golang·go
好开心啊没烦恼2 小时前
Python 数据分析:numpy,抽提,整数数组索引与基本索引扩展(元组传参)。听故事学知识点怎么这么容易?
开发语言·人工智能·python·数据挖掘·数据分析·numpy·pandas
许白掰2 小时前
【stm32】HAL库开发——CubeMX配置RTC,单片机工作模式和看门狗
stm32·单片机·嵌入式硬件·学习·实时音视频
future14123 小时前
C#学习日记
开发语言·学习·c#