首先我们必须要了解关于QT图形图像的基本知识:
QT的绘图系统是由QPainter,QPainterDevice和QPainterEngine来构成的。其中QPainter是用来绘制的类,QPainterDevice是提供绘制设备的类,而QPainterEngine是用来连接QPainter和QPainterDevice的,即在画画这个功能和绘画工具之间提供一个桥梁。
既然QPainter是用来画画的类,它就肯定会派生出很多子类,例如QWidget(也就是说QT控件基本都能在上面画画),例如QPixelmap,例如QPicture等等。
我们首先来绘制基本图形,这里我们单独建立一个单例类:
#pragma once #include <QWidget> #include "debugwidget.hpp" class DebugImage : public DebugWidget { Q_OBJECT public: static DebugImage* getDebugImage(); ~DebugImage(); void paintEvent(QPaintEvent *event); private: DebugImage(DebugWidget * parent = Q_NULLPTR); }; extern DebugImage *di; #include "debugimage.hpp" static DebugImage *di = NULL; DebugImage::DebugImage(DebugWidget * parent) : DebugWidget(parent) { show(); } DebugImage::~DebugImage() { } DebugImage* DebugImage::getDebugImage() { if (di == NULL) di = new DebugImage; return di; } void DebugImage::paintEvent(QPaintEvent * event) { QPainter painter(this); painter.drawLine(QPoint(0, 0), QPoint(50, 50)); }源码之前在写的关于调试器的博客的相关部分已经讲过了,这里只是新建了一个QPainter,并在绘制事件里绘制了一个线段。放在事件里的好处:可以在对象产生变化的时候响应画画函数,之后添加如下代码:
QPen pen(Qt::green,5,Qt::SolidLine,Qt::RoundCap,Qt::RoundJoin); QPainter painter(this); painter.setPen(pen); painter.drawLine(QPoint(0, 0), QPoint(150, 150));可以在QT painter上面画一个线,QPen里面是设置线的参数和模式的,这里就不再加以介绍了。
除了画笔画线,还可以画很多图形,比如正方形圆形,也可以使用画刷来画填充物。我们简单来使用一下画刷,毕竟以后用到再查手册就好了。
添加程序:
上面是使用的图片。
QBrush brush; brush.setTexture(QPixmap("./TEST_Graphics/1.png")); painter.fillRect(QRect(50,50,280,230),brush);之后显示效果如下:
再说一下图形的抗锯齿性:
painter.setRenderHint(QPainter::Antialiasing);可以显示出比较平整的效果,否则会感到边缘有锯齿感。
也可以使用渐变填充来填充物体,其实这些东西没有什么值得深究的,需要的时候查手册就可以了,下一节我们重点讲述坐标系统。