1. QT 绘图中创建画家类 QPainter提供了高度优化的功能,以完成大多数绘图GUI程序所需的功能。它可以画任何东西,从简单的线条到复杂的形状,如馅饼和和弦。它还可以绘制对齐的文本和像素图。通常,它绘制一个"自然"坐标系,但它也可以做视图和世界转换。QPainter可以对继承QPaintDevice类的任何对象进行操作。
其中
QT绘图
要在QT中绘图,你可以使用QPainter类。QPainter提供了一种很直观的方式来在QT应用程序中绘图。
以下是一些基本的绘图示例:
- 绘制直线
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);
}
- 绘制圆形:
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 实现绘图。