QT图形显示和处理1
首先我们必须要了解关于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);
可以显示出比较平整的效果,否则会感到边缘有锯齿感。
也可以使用渐变填充来填充物体,其实这些东西没有什么值得深究的,需要的时候查手册就可以了,下一节我们重点讲述坐标系统。