c++ dll发消息到主窗口_PyQt5学习笔记(五)窗口图形绘制

PyQt5提供了绘制图形的API,支持绘制:

  1. 文本
  2. 各种图形(直线,点,椭圆,弧,扇形,多边形等)
  3. 图像

绘制图形需要一个类QPainter。基本的绘制过程:

# 创建QPainter对象
painter = QPainter()
​
# painter初始化
painter.begin()
​
# 绘制文本
painter.drawText(...)
​
# 结束绘制
painter.end()

还有需要注意的是,绘制的场所必须是在painterEvent方法中。而这个painterEvent事件的方法会在主窗口刚刚生成时调用(生成绘制的图形)、调整主窗口大小时调用(随着主窗口的大小比例调整绘制图像的大小比例)和关闭主窗口时调用(销毁绘制的图形)


在窗口上绘制文本

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
​
class DrawText(QWidget):def __init__(self):super(DrawText, self).__init__()self.setWindowTitle("在窗口上绘制文本")self.resize(300, 200)self.text = "Hello world"
​def paintEvent(self, event):painter = QPainter(self)painter.begin(self)# 加一个输出,观察什么情况下print("Done")# 设置画笔颜色painter.setPen(QColor(150, 43, 5))# 设置字体painter.setFont(QFont("SimSun", 25))# 指定绘图区域,对齐方式和绘制内容painter.drawText(event.rect(), Qt.AlignCenter, self.text)painter.end()
​
if __name__ == '__main__':app = QApplication(sys.argv)main = DrawText()main.show()sys.exit(app.exec_())

运行结果:

c959481d91510798478e06ea221a7cb4.png
窗口刚刚弹出时,移动窗口时,放大放小窗口时,关闭窗口时。控制台上都打印了“Done”,说明在这几类情况下,主事件调用了paintEvent()方法

需要注意的是,paintEvent()是内置的事件方法,我们只是重载了,故初始化中没有调用paintEvent(),但是,实际上主循环内部自动地调用了它。所以,这个方法的名字不是我们任意起的,而是固定的(如果不是paintEvent()而是其他什么的,程序就无法正常显示绘制的内容)。

还有需要注意的是,使用painter.begin()初始化时,为了体现是固定在主窗口上创建的,必须要填入参数self

对于其中的painter.drawText()方法,需要说明其中的第一个参数:

 painter.drawText(event.rect(), Qt.AlignCenter, self.text)

第一个参数是指定的绘图区域,此处的event.rect()指的是主事件的矩形区域,也就是整个主窗口,除此之外,可以通过指定x和y来指定绘图区域,后面会讲解。


用像素点绘制正弦曲线

PyQt5中的drawPoint可以绘制一个像素点,参数是x与y。

import sys,math
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
​
class DrawPoints(QWidget):def __init__(self):super(DrawPoints, self).__init__()self.setWindowTitle("用像素点绘制正弦曲线")self.resize(300, 300)
​def paintEvent(self, event):painter = QPainter()painter.begin(self)
​painter.setPen(Qt.blue)size = self.size()
​for i in range(1000):x = 100 * (-1 + 2 * i / 1000) + size.width() / 2y = -50 * math.sin((x - size.width() / 2) * math.pi / 50) + size.height() / 2painter.drawPoint(int(x), int(y))painter.end()
​
if __name__ == '__main__':app = QApplication(sys.argv)main = DrawPoints()main.show()sys.exit(app.exec_())

运行效果:

0ffa57c53e40f7ed7d22f599fb53d73d.png

绘制不同类型的直线

import sys,math
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
​
class DrawMultiLine(QWidget):def __init__(self):super(DrawMultiLine, self).__init__()self.setWindowTitle("绘制不同类型的直线")self.resize(300, 300)
​def paintEvent(self, event):painter = QPainter()painter.begin(self)
​# 颜色, 粗细, 线条类型(默认为Qt.SolidLine,即实线)pen = QPen(Qt.red, 3, Qt.SolidLine)painter.setPen(pen)painter.drawLine(20, 40, 250, 40)
​# 点线pen.setStyle(Qt.DashDotLine)painter.setPen(pen)painter.drawLine(20 ,80, 250, 80)
​# 点点线pen.setStyle(Qt.DashDotDotLine)painter.setPen(pen)painter.drawLine(20, 120, 250 ,120)
​# 自定义点线风格pen.setStyle(Qt.CustomDashLine)pen.setDashPattern([1, 10, 5, 8])painter.setPen(pen)painter.drawLine(20, 200, 250, 200)
​painter.end()
​
​
if __name__ == '__main__':app = QApplication(sys.argv)main = DrawMultiLine()main.show()sys.exit(app.exec_())

运行结果:

e7119ae2e7288c60bcd2c3e89015f71c.png
  • drawLine(a, b, c, d):从坐标为(a,b)的点绘制到(c,d)的点的线段。
  • 窗口坐标系:(a,b)代表离窗口左侧为a个像素点,离窗口最上侧为b个像素点。

绘制各种图形

绘制弧

import sys,math
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
​
class DrawAll(QWidget):def __init__(self):super(DrawAll, self).__init__()self.setWindowTitle("绘制各种图形")self.resize(300, 300)
​def paintEvent(self, event):qp = QPainter()qp.begin(self)
​qp.setPen(Qt.blue)
​# 绘制弧# 先选定绘制区域,绘制区域为矩形(QRect)# 左上角坐标为(0, 10), 长为100, 宽为100rect = QRect(0, 10, 100, 100)# 弧为圆的一部分,角度的单位是alen:1个alen等于1/16度# 下面在rect代表的区域中绘制,起始角度为0,终止角度为50度(50 * 16 alen)qp.drawArc(rect, 0, 50 * 16)
​qp.end()
​
​
if __name__ == '__main__':app = QApplication(sys.argv)main = DrawAll()main.show()sys.exit(app.exec_())

运行结果:

a3e93775ea8eef0e4df9e6812334d669.png
绘制圆:
# 通过弧绘制圆
qp.setPen(Qt.red)
qp.drawArc(120, 10, 100, 100, 0, 360 * 16)

运行结果:

c32b2e7b47dee9481dfda24adb9bccf7.png

可以看到,除了使用QRect对象指定绘图区域,我们还可以直接初始化QRect的四个参数直接填入drawArc函数中作为前四个参数;起始位置为0,终止为止为360度的弧就是圆。

绘制带弦的弧:
# 绘制带弦的弧
qp.drawChord(10, 120, 100, 100, 12, 130 * 16)

运行结果:

e787fe39f3f67226fecaae82432372c1.png
绘制扇形
# 绘制扇形
qp.drawPie(10, 240, 100, 100, 12, 130 * 16)     

运行结果:

188cc0cac606400f7ffe64ff0966ccbf.png
绘制椭圆
# 绘制椭圆
qp.drawEllipse(120, 120, 150, 100)

运行结果:

c12c13c667a01172c6f979a70516f759.png

绘制椭圆只需要指定绘图区域,绘制出的椭圆就是指定的矩形区域的内接椭圆。所以,我们可以通过指定正方形区域来绘制圆。

绘制5边形
 # 绘制5边形
point1 = QPoint(140, 380)
point2 = QPoint(270, 420)
point3 = QPoint(290, 512)
point4 = QPoint(290, 588)
point5 = QPoint(200, 533)
​
polygon = QPolygon([point1, point2, point3, point4, point5])
qp.drawPolygon(polygon)

运行结果:

0dadb27efe21fb473995e9fadde87913.png

多边形的绘制机制也蛮显然的,通过创建多个QPoint对象指定多边形的每个顶点的坐标,再用这几个代表像素点的QPoint对象去初始化一个QPolygon对象,这个QPolygon对象作为drawPolygon的参数完成绘制。

绘制图像
# 绘制图像
image = QImage("./image/pic2.png")
rect = QRect(300, 200, 300, 230)
qp.drawImage(rect, image)

运行结果:

6c6a05e01b4afac0b87f7c19d1e03e7e.png

用画刷填充图形区域

import sys,math
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
​
class FillRect(QWidget):def __init__(self):super(FillRect, self).__init__()self.setWindowTitle("用画刷填充图形区域")self.resize(360, 300)
​def paintEvent(self, event):qp = QPainter()qp.begin(self)
​# 实心画刷brush = QBrush(Qt.SolidPattern)qp.setBrush(brush)qp.drawRect(10, 15, 90, 60)
​# 点阵画刷(类型1)brush = QBrush(Qt.Dense1Pattern)qp.setBrush(brush)qp.drawRect(130, 15, 90, 60)
​# 点阵画刷(类型2)brush = QBrush(Qt.Dense2Pattern)qp.setBrush(brush)qp.drawRect(250, 15, 90, 60)
​# 点阵画刷(类型3)brush = QBrush(Qt.Dense3Pattern)qp.setBrush(brush)qp.drawRect(10, 105, 90, 60)
​# 点阵画刷(类型4)brush = QBrush(Qt.Dense4Pattern)qp.setBrush(brush)qp.drawRect(130, 105, 90, 60)
​# 点阵画刷(类型5)brush = QBrush(Qt.Dense5Pattern)qp.setBrush(brush)qp.drawRect(250, 105, 90, 60)
​# 点阵画刷(类型6)brush = QBrush(Qt.Dense6Pattern)qp.setBrush(brush)qp.drawRect(10, 195, 90, 60)
​# 点阵画刷(类型7)brush = QBrush(Qt.Dense7Pattern)qp.setBrush(brush)qp.drawRect(130, 195, 90, 60)
​# 横格画刷brush = QBrush(Qt.HorPattern)qp.setBrush(brush)qp.drawRect(250, 195, 90, 60)
​qp.end()
​
​
if __name__ == '__main__':app = QApplication(sys.argv)main = FillRect()main.show()sys.exit(app.exec_())

运行结果:

fd1905115d6e4256ee2ca02697a90fde.png

每创建一个画刷对象,都需要调用QPainter对象的setBrush()方法设置画刷。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/411753.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[jQuery] 针对jQuery性能的优化方法有哪些?

[jQuery] 针对jQuery性能的优化方法有哪些? show slide animate 等频繁修改 dom 很耗性能,可采用 jquery.transit 插件等使用单个 id 或 class 选择器当然也是优化点咯,元素选择器是真的会卡每次调用 $() 其实都是生成一个超大的对象&#xf…

[转] SQL Server中的行列转换问题

原表结构序号性别部门工资1男部门a8002女部门b9003男部门a4004女部门d 14005男部门e12006男部门f5007女部门a 3008男部门d10009女部门d123010女部门b200011男部门c200012男部门b1200最终显示 部门名 人数 男 女 小于800元 从800至999 从1000元至1190元 大于12…

vue-cli@2的原理解析

作为一个菜鸟,我有一颗好奇的心,每当vue init 的时候,看到那流畅的进度和神奇的结果,心里都充满一窥其本质的期望…… 以下就是我不断的console,大致理出来的一个流程心得,纪录在此,以作备忘。 …

怎么用计算机直接截图,电脑截图快捷键怎么使用,电脑怎么快捷键截图

我们对电脑快捷键都不陌生,有快捷键的帮助,我们可以加快电脑操作速度。那不知道大家对电脑截图快捷键有了解吗?下面小编就跟大家分享下电脑截图快捷键的几种使用方法。1. 首先使用电脑自带的截图。我们只需要使用快捷键【PrtScn】即可。在需要…

c语言数组指定位置插入和删除_Apache POI在指定位置插入表格

接到的需求是在模板表格的指定位置再插入表格。比如在模板的${proTable}处插入表格。依赖的包org.apache.poi poi 3.15org.apache.poi poi-ooxml 3.15插入表格由于是在表格里的指定地方插入表格,所以要遍历表格的每个单元格,查找到要插入点的占位符。// …

[jQuery] jQuery与jQuery UI有啥区别?

[jQuery] jQuery与jQuery UI有啥区别? 1)jQuery是一个js库,主要提供的功能是选择器、属性修改和事件绑定等 2)jQuery UI则是在jQuery的基础上,利用jQuery的扩展性,设计的插件。提供了一些常用的界面元素&a…

学习URLRewriter.dll的使用

1.添加引用 2.配置webconfig webconfig1<?xml version"1.0" encoding"utf-8"?> 2<configuration> 3 4 <configSections> 5 <section name"RewriterConfig" type"URLRewriter.Config.RewriterConfigSerializer…

高斯消元

高斯消元 高斯消元可真是复杂啊。。。。。 高斯消元求解n元一次线性方程组的板子题&#xff1a; P3389 【模板】高斯消元法 举个栗子&#xff1a; 2x y - z 8 -3x - y 2z -11-2x y 2z -3先将它存到矩阵中&#xff1a;②①* (2/3) ③① 接着对①变…

uoni扫地机器人好用吗_扫地机器人好用吗?了解性能看这篇

扫地机器人这类智能家电已经逐渐渗透到大众家庭中,尽管大家对这一品类不再陌生,但对它的性能了解并不全面。况且,市场上扫地机器人产品多不胜数,可实际使用效果和宣称效果存在较大差异。因此建议大家在选购和使用产品时要关注以下几个方面:本文引用地址&#xff1a;http://www.…

[jQuery] jQuery和Zepto的区别?各自的使用场景?

[jQuery] jQuery和Zepto的区别&#xff1f;各自的使用场景&#xff1f; 创建$的方式不同。前者略微要大&#xff0c;后者略微小点。场景....emmmm个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目…

原子微型结构信息应用到局部图形信息存储的猜想

昨天想着看一些图形学方面的知识&#xff0c;在CSDN上看到说Gabor函数可以精确是被图形细微处。于是从网上找了下面这么一篇文章看看&#xff1a; 二、Gabor函数 Gabor变换属于加窗傅立叶变换&#xff0c;Gabor函数可以在频域不同尺度、不同方向上提取相关的特征。另外Gabor函数…

西北大学计算机科学排名,西北大学计算机科学与信息系统Computer Science and Information Systems世界排名2020年最新排名第151-200位(QS世界排名)...

2020年QS计算机科学与信息系统Computer Science and Information Systems专业世界排名公布&#xff0c;西北大学计算机科学与信息系统世界排名第151-200位&#xff0c;西北大学计算机科学与信息系统专业实力怎么样呢&#xff1f;下面美英港新留学介绍西北大学计算机科学与信息系…

Hadoop 集群的三种方式

1,Local(Standalone) Mode 单机模式 $ mkdir input$ cp etc/hadoop/*.xml input$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.9.2.jar grep input output dfs[a-z.]$ cat output/* 解析$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-ex…

apache phoenix 入门_实现Phoenix入门

快速入门Phoenix是一个开源的HBASE SQL层。Phoeinx可以用标准的JDBC API替代HBASE client API来创建表&#xff0c;插入和查询查询HBASE中的数据。Phoenix作为应用层和HBASE之间的中间件,以下特性使它在大数据量的简单查询场景有着独有的优势1. 二级索引支持(global index loc…

腾讯与微软合作,准备应用Silverlight技术

腾讯和微软计划在Silverlight技术上展开深入合作&#xff0c;腾讯后续会在多项业务中应用Silverlight技术&#xff0c;这个视频展示了腾讯使用Silverlight可能应用的场景。查看详情:http://labs.qq.com/e/51/ 转载于:https://www.cnblogs.com/nasa/archive/2008/04/22/1165464.…

如何增强台式计算机无线网络,台式机无线网信号差怎么解决

台式机无线网信号非常的差&#xff0c;玩什么都卡&#xff0c;那么我要怎么样解决呢?下面由小编给你做出详细的台式机无线网信号差解决方法介绍!希望对你有帮助!台式机无线网信号差解决方法一&#xff1a;在确保无线网卡的驱动程序都正确安装的前提下&#xff0c;给出如下建议…

三阶矩阵的lu分解详细步骤_快速入门矩阵运算——开源库Eigen

矩阵是数学中一个重要的工具&#xff0c;广泛应用于各种场景下的数值分析&#xff0c;例如&#xff0c;数字信号处理&#xff0c;图像处理等。我们如何在程序中使用矩阵进行运算呢&#xff1f;本文将为大家介绍一个开源的矩阵运算工具——Eigen。Eigen is a C template library…

【转】接口 与 抽象类

本文转自&#xff1a;http://blog.***/article.asp?id89介绍&#xff1a;在本文中&#xff0c;我将借一个DEMO讨论下接口和抽象类。抽象类和接口的的概念对初学面向对象编程的人来说&#xff0c;总容易迷惑。所以&#xff0c;我试着讨论下两者的理论并比较他们的使用。最后我将…

第十三届东北师范大学程序设计竞赛热身赛 C(exgcd+欧拉函数)

题目链接 思路 对于答案&#xff0c;我们考虑对于每个可行的$c$会和多少$d$产生合法序偶。首先证明$c$和$b$必然互质。 假设$c$和$b$不互质&#xff0c;那么设$t_{1}gcd(c, b),(t_{1} > 1)$对于 $(c*d)\%ba$ 等价于 $(k_{1}*t_{1})\%ba,(k_1\in Z)$ $(k_{1}*t_{1})\%(k_{2}*…

[jQuery] Zepto的点透问题如何解决?

[jQuery] Zepto的点透问题如何解决&#xff1f; 1、“点透”是什么你可能碰到过在列表页面上创建一个弹出层&#xff0c;弹出层有个关闭的按钮&#xff0c;你点了这个按钮关闭弹出层后后&#xff0c;这个按钮正下方的内容也会执行点击事件&#xff08;或打开链接&#xff09;。…