PyQt编程:二维图形的简单绘制及坐标变换示例

引言

在Qt界面库中,可以通过以下两种方式进行图形的绘制:

l 对于普通的二维绘图,可使用QPainter在QWidget、QPixmap等绘图设备上绘图,通过绘制一些基本的点、线、圆等基本形状组成自己需要的图形,这种方式得到的图形是不可交互的图形。

l 对于需要绘制大量的、需要交互图形,可借助于Graphics View架构,使用QGraphicsView、QGraphicsScenet和各种QGraphicsItem类进行绘制。这种方式可以在一个场景中可绘制大量图元项,且每个图元项都是可选择、可交互的。

下面给出一个在Python语言下结合PyQt界面库,使用QPainter进行绘图的例子,例子中也涉及到了坐标系统的变换方法。

示例说明

该例运行界面如下图所示:

在主界面上分成了三个区域,每个区域上都画了一个绿色填充的矩形框。其中,第一个是原始的矩形框,第二个是在第一个的基础上缩小0.8倍并顺时针旋转45度的矩形框,第三个是仅仅顺时针旋转90的矩形框。这这个例子中使用到了QPainterPath和QPainter的坐标变换功能。

主窗口类设计

本例比较简单,主界面程序完全使用纯代码实现,在代码中设计了一个基于QWidget的类MainWindow,用作主界面的显示窗口类,其实现代码如下图所示:

使用QPainter绘制图形需重定义窗口类的paintEvent事件,即所有的绘制工作都是在该事件中完成的。其主要代码解释如下:

(1)第15-18行,窗口类的初始化函数。设置了窗口标题,初始化了窗口大小为600×300。

(2)第21-22行,定义一个QPainter对象p并设置抗锯齿功能。

(3)第24-27行,在主窗口上画两条竖线将其平均划分为三个区域,仅用于指示功能。

(4)第29-31行,设置矩形框的画笔及填充的画刷样式。

(5)第33-35行,定义一个QPainterPath,用来记录所画内容的过程,本例仅仅画了一个矩形框,其中心是(0,0)位置。对于一个复杂图形的绘制,使用QPainterPath的优点是,通过QPainterPath类型的变量记录整个绘画过程后,可以重复使用。如本例,在绘制三个矩形框时,只需将坐标平移及缩放后,就可以绘制不同的矩形框。

(6)第37-40行,绘制第一个矩形框。先使用save函数保存当前的坐标状态(即原始坐标状态),然后将坐标平移到(100,150)后调用绘制路径函数drawPath绘制矩形框,最后调用restore函数恢复上次的坐标状态。

(7)第42-45行,绘制第二个矩形框。由于上次绘制完成坐标已经回到了初始状态,所以此次是相对于初始位置将坐标平移到(300,150),然后再缩放、旋转完成绘制。注意,若没有上一个restore,则会在上一次的基础上进行平移。

(8)第47-50行,绘制第三个矩形框。绘制之前,先调用resetTransform函数复位所有坐标变换,然后进行绘制。

完整测试代码

程序完整测试代码如下图所示:

运行后就会出现本文开头所示的软件界面。

总结

本文例子演示了在Python+PyQt架构下,使用QPainter进行简单绘图的过程,例子中涉及到了平移、旋转、缩放等坐标变换操作及QPainterPath类的使用等内容。

如果这篇文章对你有用的话,请关注+转发+收藏+点赞吧。

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20190326A0GQ1500?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券