今天给大家简单介绍下Qt的绘图系统。
1 QPainter、QPaintDevice和QPaintEngine
Qt二维绘图系统,主要由三部分组成,QPainter、QPaintDevice和QPaintEngine类。
- QPainter是一个绘图类,可以理解为现实中的画家,用户可以为这个画家指定画笔,画刷,让他为我们绘画矩形,圆形乃至更复杂的图形。
- QPaintDevice是一个二维空间的抽象,比如QWidget就是继承该类的,所以凡是继承自QWidget的类,都可以让QPainter这个画家为你作画,该类可对比现实中的画板。
- QPaintEngine可以认为它为QPainter和QPaintDevice之间提供了中间层接口,所以QPainter才可以在很多不同的设备之间使用同样的接口进行绘画,QPaintEngine类由QPainter和QPaintDevice在内部使用,一般不需要我们关注。
2 绘制多边形
Qt绘图,需要重新实现
void paintEvent(QPaintEvent* e);
在函数体中使用QPainter绘图。
下面,我们新建GUI项目PolygonGraph,继承自QWidget,类名为PolygonGraph,不需要勾选“创建ui界面”。
本例中绘制了一个六边形,并为每条边对应的区块填充了颜色。
polygongraph.h
#ifndef POLYGONGRAPH_H #define POLYGONGRAPH_H #include <QWidget> class PolygonGraph : public QWidget { Q_OBJECT public: PolygonGraph(QWidget *parent = 0); ~PolygonGraph(); protected: //在保护成员中,重写paintEvent void paintEvent(QPaintEvent* e); }; #endif // POLYGONGRAPH_H
polygongraph.cpp
#include <QtMath> #include <QPainter> #include "polygongraph.h" PolygonGraph::PolygonGraph(QWidget *parent) : QWidget(parent) { } PolygonGraph::~PolygonGraph() { } void PolygonGraph::paintEvent(QPaintEvent *e) { /* * 绘制多边形 本例中直接写的六边形 * int count 多边形的边数 * float radius 多边形半径 */ int count = 6; int radius = 100; /* * 注意: * 在使用QPainter绘图之前,必须先指定绘图设备。 * 下方指定的是在本窗口中绘制。 * 如果没有指定绘图设备,则在之后的绘图中将无效。 * 指定绘图设备的方法还可以使用begin() end()组合。 * QPainter在同一时刻,只能在一个设备上绘制,如果将其切换至另一个设备,将是无效的。 */ QPainter painter(this); //设置为抗锯齿,并且设置画笔颜色为浅灰 painter.setRenderHint(QPainter::Antialiasing); painter.setPen(Qt::lightGray); /* * 绘图设备的坐标原点(0,0)在左上角,水平向右增长,垂直向下增长。 * 首先先平移坐标原点,让原点在绘图设备的中心 */ painter.translate(width()/2., height()/2.); //开始绘制多边形,并为每个区块上色 for (int i = 0; i < count; ++i) { //设中心点到边的垂线与半径的夹角为degree=(360/count)/2即: float degree = 180./count; //先将坐标进行旋转,然后再绘制 painter.rotate(2 * degree); //设边长的一半为wid,则wid = radius*sin(degree) //原点到边的距离为hei,则hei = radius*cos(degree) //在程序中三角函数都是以弧度为基准,所以要先将角度转化成弧度。 //头文件要包含QtMath float radian = qDegreesToRadians(degree); float wid = radius * qSin(radian); float hei = radius * qCos(radian); //绘制该三角区块 QPainterPath path; path.lineTo(-wid, -hei); path.lineTo(wid, -hei); path.lineTo(0, 0); painter.drawPath(path); //随机生成一个颜色,作为该区块的颜色,并上色 QColor color(qrand()%255, qrand()%255, qrand()%255, 150); painter.fillPath(path, color); } }
现在编译运行程序:
当我们改变窗口大小,切换进程都会发现图中的颜色发生变化,这是因为都会调用paintEvent进行重绘。
好的,今天的分享就到这里了,可能有些小伙伴对于程序中的坐标平移,旋转不是很明白,下篇文章,小豆君会详细讲解Qt的绘图的矩阵变换,敬请关注。
如果你想要获得更多干货,可关注我的微信公众号:小豆君,关注后还可加入C++\Qt交流群,一起学习。