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也是一个状态机,这里我们所说的这些属性都是处于这个状态机之中的,因此,我们应该记得是否要将其保存下来或者是重新构建。