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 分钟前
LibYAML超全教程-C语言YAML解析与生成
c语言·开发语言·配置文件·yaml解析·libyaml·开源库实战
paopaokaka_luck8 分钟前
基于Springboot3+Vue3的宠物殡葬管理系统(webSocket实时通讯、接入腾讯地图、支付宝沙盒支付、Echarts图形化分析)
java·开发语言·网络·后端
逝水无殇12 分钟前
HTML 元素详解
开发语言·前端·html
Lhappy嘻嘻25 分钟前
网络初识|基础入门:局域网广域网、IP 端口、TCP/IP 五层模型与封装解封装全过程
java·开发语言·网络·笔记·网络协议·tcp/ip
LiaoWL12331 分钟前
【SpringCloud合集-06】Spring Cloud Gateway网关学习笔记
笔记·学习·spring cloud
Wang's Blog38 分钟前
Go-Zero基础入门1: 微服务框架与选型分析
开发语言·微服务·golang
鱼听禅1 小时前
ubuntu学习笔记-使用ls-ml-toolkit工具识别Label Studio数据数据训练yolo模型
笔记·学习·ubuntu
科技道人9 小时前
记录 默认置灰/禁用 app ‘Search Engine Selector‘ 的disable按钮
开发语言·前端·javascript
xian_wwq11 小时前
【学习笔记】模型权重管理:Safetensors与私有化Hub(23/35)
笔记·学习
逝水无殇11 小时前
C# 异常处理详解
开发语言·后端·c#