qt绘图体系模型:
QPainter:绘图操作者
QPaintEngine:对开发人员是透明的。除非你需要自定义一个设备,否则你是不需要关心QPaintEngine这个类的。绘图操作者与绘图设备的通信中间层,一般是对开发者透明,除非要实现自定义绘图设备;
QPaintDevice:绘图设备,绘图的目标,承载绘图效果的逻辑空间;
五种绘图设备:
QPixmap:【即是一种平台差别绘图设备】
是针对屏幕进行特殊优化的,因此,它与实际的底层显示设备息息相关。注意,这里说的显示设备并不是硬件,而是操作系统提供的原生的绘图引擎。所以,在不同的操作系统平台下,QPixmap的显示可能会有所差别。无法提供像素级别的操作,依赖于各个平台底层绘图引擎
QBitmap:【即单色绘图设备】
继承自QPixmap,因此具有QPixmap的所有特性,提供单色图像;实际上是只有黑白两色的图像数据
QImage:【平台独立绘图设备】
使用Qt自身的绘图引擎,可在不同平台上具有相同的显示效果;由于QImage是独立于硬件的,也是一种QPaintDevice,因此我们可以在另一个线程中对其进行绘制,而不需要在GUI线程中处理,使用这一方式可以很大幅度提高UI响应速度。可操作像素级
QPicture:【永久保存绘图设备,类似于xml,json,protobuf等是独立语言独立平台的保存格式】【逻辑上也拥有无限的大小】
这是一个可以记录和重现QPainter命令的绘图设备。 QPicture将QPainter的命令序列化到一个IO设备,保存为一个平台独立的文件格式。这种格式有时候会是“元文件(meta- files)”。Qt的这种格式是二进制的,不同于某些本地的元文件,Qt的pictures文件没有内容上的限制,只要是能够被QPainter绘制的元素,不论是字体还是pixmap,或者是变换,都可以保存进一个picture中。
QPicture是平台无关的,因此它可以使用在多种设备之上,比如svg、pdf、ps、打印机或者屏幕。回忆下我们这里所说的QPaintDevice,实际上是说可以有QPainter绘制的对象。QPicture使用系统的分辨率,并且可以调整 QPainter来消除不同设备之间的显示差异。
如果我们要记录下QPainter的命令,首先要使用QPainter::begin()函数,将QPicture实例作为参数传递进去,以便告诉系统开始记录,记录完毕后使用QPainter::end()命令终止。
QWidget:窗口绘图设备
绘图设备可以使用QPainter在其绘图设备上进行绘图;也可以做为一部分贴图到其他绘图设备上,见下图代码
QImage与QPixmap之间的转换:
* QImage转QPixmap
使用QPixmap的静态成员函数: fromImage()
QPixmap fromImage(const QImage & image,
Qt::ImageConversionFlags flags = Qt::AutoColor)
* QPixmap转QImage:
使用QPixmap类的成员函数: toImage()
QImage toImage() const
//示例
#include "widget.h"
#include "ui_widget.h"
#include<QPainter>
#include<QDebug>
#include<QImage>
#include<QPicture>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
}
void Widget::paintEvent(QPaintEvent *event)
{
QPixmap pix(300,300);
pix.fill(Qt::white);
QPainter painter(&pix);
painter.setPen(Qt::green);
painter.drawEllipse(QPoint(150,150),100,100);
if(!pix.save("./pix.png"))
qDebug()<<"failed!";
QImage img(300,300,QImage::Format_RGB32);
img.fill(Qt::white);
QPainter painter2(&img);
painter2.setPen(Qt::blue);
painter2.drawEllipse(QPoint(150,150),100,100);
if(!img.save("./img.png"))
qDebug()<<"failed!";
QPicture pic;
QPainter painter3;
painter3.begin(&pic);
painter3.setPen(Qt::black);
painter3.drawEllipse(QPoint(150,150),100,100);
painter3.end();
pic.save("pic.tsss");
QPicture lpic;
lpic.load("pic.tsss");
QPainter lpainter(this);
lpainter.drawPicture(QPoint(200,200),lpic);
}
Widget::~Widget()
{
delete ui;
}
qt:绘图体系模型
最新推荐文章于 2024-05-03 22:47:47 发布