Qt绘图的方法

简介

QPainter是Qt的画图类,在其中封装了很多底层的绘图函数。使用QPainter可以在多种类型的设备上画图,如:Qt的窗口、QPixmap或者是打印设备上。但是怎么使用它,在哪个地方使用它才能够满足我们的画图要求,却不是仅仅看一个QPainter类说明就行的。以下为在Qt中画图的一些常见方法,有些需要使用到QPainter绘制,而有些则不需要。

在paintEvent函数中绘图

在一个窗口上画图,最简单、最直接的方法就重新这个窗口的类的重绘事件的处理函数paintEvent(),在paintEvent函数中实现自己的绘制内容。

当窗口发生变化需要重绘时,paintEvent函数被会自动被调用。如果需要强制刷新,则可以调用repaint()和update()函数,不要直接使用paintEvent函数。

在paintEvent函数中画图的实例的C++代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void MainWindow::paintEvent(QPaintEvent *event)
{
QPainter painter(this);

// 设置画笔颜色
painter.setPen(QColor(0, 160, 230));

// 设置字体:微软雅黑、点大小50、斜体
QFont font;
font.setFamily("Microsoft YaHei");
font.setPointSize(50);
font.setItalic(true);
painter.setFont(font);

// 反走样
painter.setRenderHint(QPainter::Antialiasing, true);

// 绘制图片
painter.drawPixmap(rect(), QPixmap(":/Images/logo"));

// 绘制文本
painter.drawText(rect(), Qt::AlignCenter, "Qt");
}

利用QGraphicsView和QGraphicsScene绘图

利用paintEvent函数最基本的绘图方法,不管是主窗口还是窗口上的控件都可以重写paintEvent函数,但是这种方法却不够灵活。有很多时候我们都希望能够在窗口的一个控件上随着程序需要绘制相应的图像对象,这个时候总是要去重写一个控件是很麻烦的事情。这个时候我们可以使用到QGraphicsView和QGraphicsScene来管理和显示需要绘制的图像对象。

QGraphicsView是一个专门用来显示绘制图像的控件,但是它一般需要配合QGraphicsScene一起才能很好的使用。相比paintEvent实现绘图,QGraphicsView和QGraphicsScene则要高级得多,在这里Graphics View提供的是一种类似于Qt model-view的编程。多个views可以监视同一个场景,而场景包含多个具有多种几何外形的items。QGraphicsView提供了视图部件,它可视化场景中的内容。QGraphicsScene 表示Graphics View中的场景,它能够高效的管理在它其中的场景元素。

简而言之就是,QGraphicsView是显示的控件,QGraphicsScene是场景本身。显示的控件可以从不同角度展示同一个场景。因此我们在QGraphicsScene绘图,用QGraphicsView显示。

假定窗口里面有名graphicsView的QGraphicsView,以下为QGraphicsView和QGraphicsScene绘图python代码实例:

1
2
3
4
5
6
7
8
9
10
11
def draw(self):
scene = QGraphicsScene()

scene.addPixmap(QPixmap(r'E:\CaptureFile\test.png'))
scene.addRect(QtCore.QRectF(50,50,80,80), QtGui.QPen(QtGui.QColor(255,0,0)))
scene.addRect(QtCore.QRectF(50,200,80,80), QtGui.QPen(QtGui.QColor(0,255,0)))
t = scene.addText("scene test", QtGui.QFont("Arial", 20))

self.graphicsView.setAlignment(QtCore.Qt.AlignHorizontal_Mask)
self.graphicsView.setScene(scene)
self.graphicsView.show()

除去以上代码,QGraphicsView和QGraphicsScene还可以结合QPainter来绘制,前面就提过QPainter是可以在QPixmap上绘制的,所以我们可以先用QPainter在一个QPixmap上绘制好图像,然后将其添加到场景中显示,代码如下:

1
2
3
4
5
6
7
8
9
10
11
def draw(self):
scene = QGraphicsScene()
mp = QPixmap(r'E:\CaptureFile\test.png')
paint = QPainter()
paint.begin(mp)
paint.drawEllipse(10,20, 80,70)
paint.drawRect(100,100,200,200)
paint.end()
scene.addPixmap(mp)
self.graphicsView_1.setScene(scene)
self.graphicsView_1.show()

其他

除开QPainter画图外,我们还可以利用其他库进行绘制图像,如python中的PIL.Image库,然后用Qt进行显示。

Compartir