[学习][笔记] qt5 从入门到入坟:<八>Qt 绘制系统

Qt 学习之路 2(24):Qt 绘制系统简介

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

Qt 学习之路 2(25):画刷和画笔

画刷和画笔

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()用于填充画笔所绘制的线条。
[学习][笔记] qt5 从入门到入坟:<八>Qt 绘制系统

笔帽样式

capStyle()定义了使用QPainter绘制的线的末端;
[学习][笔记] qt5 从入门到入坟:<八>Qt 绘制系统
[学习][笔记] qt5 从入门到入坟:<八>Qt 绘制系统

连接样式

joinStyle()则定义了两条线如何连接起来。

[学习][笔记] qt5 从入门到入坟:<八>Qt 绘制系统
[学习][笔记] qt5 从入门到入坟:<八>Qt 绘制系统

画笔宽度

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

上一篇:Qt开源作品25-电池电量控件


下一篇:Qt5加载SVG格式的图片并更颜色