Qt 绘制系统简介
Qt 的绘图系统允许使用相同的 API 在屏幕和其它打印设备上进行绘制
整个绘图系统基于QPainter,QPainterDevice和QPaintEngine三个类。
QPainter用来执行绘制的操作;
QPaintDevice是一个二维空间的抽象,这个二维空间允许QPainter在其上面进行绘制,也就是QPainter工作的空间;
QPaintEngine提供了画笔(QPainter)在不同的设备上进行绘制的统一的接口。
QPainter是画笔。
QPaintDevice是画布。
QPaintEngine是笔筒,是接口 提供画笔的。
QPainter
//paintedWidget.h
#ifndef PAINTEDWIDGET_H
#define PAINTEDWIDGET_H
#include <QPainter>
#include <QWidget>
class PaintedWidget : public QWidget
{
Q_OBJECT
public:
PaintedWidget(QWidget *parent = 0);
protected:
void paintEvent(QPaintEvent *);
};
#endif // PAINTEDWIDGET_H
//paintedWidget.cpp
#include "paintedWidget.h"
PaintedWidget::PaintedWidget(QWidget *parent) :
QWidget(parent)
{
resize(800, 600);//设置了窗口的大小和标题
setWindowTitle(tr("Paint Demo"));
}
void PaintedWidget::paintEvent(QPaintEvent *) //绘制
{
QPainter painter(this);
painter.drawLine(80, 100, 650, 500);//
painter.setPen(Qt::red);
painter.drawRect(10, 10, 100, 400);
painter.setPen(QPen(Qt::green, 5));
painter.setBrush(Qt::blue);
painter.drawEllipse(50, 150, 400, 200);
}
//main.cpp
#include <QApplication>
#include <paintedWidget.h>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
PaintedWidget w;
w.show();
return a.exec();
}
!!!
paintEvent()是需要重复进入的,因此,需要注意第二次进入时,QPainter的状态是不是和第一次一致,否则的话可能会造成闪烁的现象。
QPainter接收一个QPaintDevice指针作为参数。QPaintDevice有很多子类,比如QImage,以及QWidget。注意回忆一下,QPaintDevice可以理解成要在哪里去绘制,而现在我们希望画在这个组件,因此传入的是 this 指针。
!!!
绘制顺序,首先是直线,然后是矩形,最后是椭圆。按照这样的绘制顺序,可以看到直线是第一个绘制,位于最下一层;矩形是第二个绘制,在中间一层;椭圆是最后绘制,在最上层。
需要重绘情况
比如组件刚刚创建出来的时候就需要重绘;组件最大化、最小化的时候也需要重新绘制;组件由遮挡变成完全显示的时候也需要等等。
QPainterDevice
QPaintEngine
画刷和画笔
QBrush画刷
QBrush定义了QPainter的填充模式,具有样式、颜色、渐变以及纹理等属性。
画刷的color()定义了填充模式的颜色。
画刷的gradient()定义了渐变填充。
Qt 提供了三种渐变:
QLinearGradient、QConicalGradient和QRadialGradient,它们都是QGradient的子类。
QRadialGradient gradient(50, 50, 50, 50, 50);
gradient.setColorAt(0, QColor::fromRgbF(0, 1, 0, 1));
gradient.setColorAt(1, QColor::fromRgbF(0, 0, 0, 0));
QBrush brush(gradient);
QPen画笔
QPen定义了用于QPainter应该怎样画线或者轮廓线。
画笔具有 样式、宽度、画刷、笔帽样式和连接样式 等属性。
画笔样式
style()定义了线的样式。画刷brush()用于填充画笔所绘制的线条。
笔帽样式
capStyle()定义了使用QPainter绘制的线的末端;
连接样式
joinStyle()则定义了两条线如何连接起来。
画笔宽度
width()或widthF()定义了画笔的宽。
QPainter painter(this);
QPen pen; // creates a default pen
pen.setStyle(Qt::DashDotLine);
pen.setWidth(3);
pen.setBrush(Qt::green);
pen.setCapStyle(Qt::RoundCap);
pen.setJoinStyle(Qt::RoundJoin);
QPainter也是一个状态机,这里我们所说的这些属性都是处于这个状态机之中的,因此,我们应该记得是否要将其保存下来或者是重新构建。