QT绘图总结
1.QT绘图介绍
如果想要使用一个图片或者直接在页面上写字就要使用QT绘图。
当然,也可以选择在组件上绘图,如QLabel。
Qt 的绘图系统允许使用相同的 API 在屏幕和其它打印设备上进行绘制。整个绘图系统基于QPainter,QPainterDevice和QPaintEngine三个类。
怎么记住这三个类之间的关系呢?
可以从这三个英文的翻译来记。
有一个画家(QPainter),他经常出去写生,但是不可能直接画,肯定要有一个容器接收画的内容,可以是画板(QPainterDevice),但是除了画板还可以有画纸(QPaintEngine)。
画家在画纸上画画,而画纸又得在画板上夹住,要不纸可能承受不住画笔的力量而漏个洞。
2.QT绘图使用
要使用绘图,得重写QT的paintEvent事件。
上面简单说明了一下绘图的三个类,但是想起来就很复杂,每次绘图都是要使用三个类吗?
1.画家可以做什么呢?
选画刷、选画笔、写字、画一些图形、贴图片、更改画纸的位置、旋转画纸等。
void PaintedWidget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.drawLine(80, 100, 200, 200);
painter.setPen(Qt::red);
painter.drawRect(10, 10, 10, 40);
painter.setPen(QPen(Qt::green, 5));
painter.setBrush(Qt::blue);
painter.drawEllipse(50, 150, 40, 20);
}
2.如果没有画板(QPainterDevice)或者画纸(QPaintEngine)可以吗?
也是可以的,没有画板、画纸就是直接画在地上也是可以的。
void PaintedWidget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.drawLine(80, 100, 200, 200);
painter.setPen(Qt::red);
painter.drawRect(10, 10, 10, 40);
painter.setPen(QPen(Qt::green, 5));
painter.setBrush(Qt::blue);
painter.drawEllipse(50, 150, 40, 20);
}
3.如果没有画家(QPainter)可以吗?
也可以直接用绘画设备画画,一个普通人直接在画板上夹一张图片也能展示,但没有因为这个人不是画家就不会画画。不过如果想要在这图片上画画,就得是画家才行了。
void PaintWidget::paintEvent(QPaintEvent *)
{
QPixmap pixmap(":/Image/1.png");
QPixmap pixmap1(":/Image/2.png");
QBitmap bitmap(":/Image/3.png");
QBitmap bitmap1(":/Image/4.png");
QPainter painter(this);
painter.drawPixmap(0, 0, pixmap);
painter.drawPixmap(200, 0, pixmap1);
painter.drawPixmap(0, 130, bitmap);
painter.drawPixmap(200, 130, bitmap1);
}
绘画设备有三种:QPixmap 、QBitmap、QImage。
QPixmap使用底层平台的绘制系统进行绘制,不支持像素级别的操作。
QImage使用独立于硬件的绘制系统,支持像素级别的操作。
QBitmap继承自QPixmap,不过只提供单色图像,不是黑像素点就是白像素点。
4.画纸(QPaintEngine)有啥作用呢,反正直接用画板也没有啥影响吧?
当然可以不使用画纸,画纸就是为了适配更多的绘画设备,有了画纸,就可以记录并重现绘画的内容了,如果你以后想使用现在画的这个东西,可以用画纸保存起来,以后不管是画板还是墙上还是画框,都是可以放这个画纸在里面的。
void PaintWidget::paintEvent(QPaintEvent *)
{
QPicture pic;
QPainter painter;
//将图像绘制到QPicture中,并保存到文件
painter.begin(&pic);
painter.drawEllipse(20, 20, 100, 50);
painter.fillRect(20, 100, 100, 100, Qt::red);
painter.end();
pic.save("D:\\drawing.pic");
//将保存的绘图动作重新绘制到设备上
pic.load("D:\\drawing.pic");
painter.begin(this);
painter.drawPicture(200, 200, pic);
painter.end();
}