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,一经查实,立即删除!

相关文章

[转] 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插入表格由于是在表格里的指定地方插入表格,所以要遍历表格的每个单元格,查找到要插入点的占位符。// …

学习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) ③① 接着对①变…

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

昨天想着看一些图形学方面的知识&#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…

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

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

birt报表表格边框_Python 快速设置 Excel 表格边框

1. 安装 xlwings直接安装用 pip install xlwings2. 导入 xlwingsimport xlwings as xw3. 打开 Excel 文件# 打开存好的 Excelapp xw.App() # 设置应用wb xw.Book(data/小蜜蜂超市销售报表.xlsx) # 打开文件ws wb.sheets[Sheet1] # 选择表格4. 获取表格行列last_column ws.…

矢量合成和分解的法则_力的合成与分解

1力的合成一、合力与分力当一个物体受到几个力的共同作用时&#xff0c;我们常常可以求出这样一个力&#xff0c;这个力产生的效果跟原来几个力的共同效果相同&#xff0c;这个力就叫做那几个力的合力&#xff0c;原来的几个力叫做分力&#xff0e;二、合力与分力的关系1.合力与…

[导入]相片: 53787515.jpg

文章来源:http://img.blog.163.com/photo/5VZ9bIclg8NWuT90ExHHmQ/1697575584542151534.jpg转载于:https://www.cnblogs.com/baiyirui/archive/2008/04/27/1173122.html

超导量子计算机速度多快,我国量子计算机实现量子霸权,计算速度比谷歌快了100亿倍...

12月4日&#xff0c;中国科学技术大学宣布&#xff0c;我国新构建的76个光子的量子计算机实现了量子霸权。在5000万个样本的高斯玻色取样实验中&#xff0c;“九章”量子计算机仅用了200秒就完成了&#xff0c;如果使用世界第三的超级计算机进行实验&#xff0c;它也要将近20亿…

初一辍学学php能行吗_《夺冠》破7亿,辍学的农村姑娘成排球女王,朱婷:百炼才能成钢...

分享职场故事&#xff0c;交流职场经验&#xff0c;欢迎关注“闫湘”。《夺冠》累计票房7亿&#xff0c;让大家再一次领略了女排精神&#xff0c;而“2019-2020年中国运动员传播影响力榜第1名&#xff0c;朱婷&#xff01;”朱婷这个名字又一次响彻全中国。与今天的风光不同&am…

关于eclipse项目的x号报错的一些问题

有些时候项目中并未有什么问题 但项目前会有一个X号报错且无法运行项目 我们不妨从jre和Tomcat的一些配置中找原因 1&#xff0c;首先查看jre的安装是否正确&#xff0c;可以看见并未出错 &#xff0c;如果有问题&#xff0c;重新导入一下即可 2&#xff0c;打开项目的Java bui…

iWindowsMobile Launches Updated ZoomBoard

今天发现一个好东西&#xff0c;发上来和大家分享&#xff01;它来自iwindowsmobile.com(模拟iphone嫌疑)&#xff0c;因为在这里我发现了很多Windows Mobile用户梦寐以求的软件&#xff0c;我想应该叫这个站点为iheartwindowsmobile.com更为贴切&#xff0c;不管它叫什么&…

idea和搜狗输入法快捷键冲突_ubuntu18.04安装搜狗输入法

1. 必要时可获取root权限ubuntu在我们安装时并不是root权限,而是我们自己建立的用户,虽然可以使用sudo 命令,但是有时候还是不方便,毕竟root就是一切.输入 su即可切换root卸载ibusubuntu默认使用ibus管理输入法,官方推荐使用fcitx.我们先卸载ibussudo apt-getremove ibus清除ib…

同方专转本计算机视频,同方2011专转本计算机

同方2011专转本计算机 (3页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;9.9 积分namespace W_{ public partial class Form1 : Form { bool isDotpressed false; decimal dOpDaTa1, dOpDaTa2, dre…

wps流程图怎么不能添加文字_windows不能访问共享文件夹,不能添加共享打印机时,怎么解决呢...

遇到文件夹共享不能访问或者打印机共享添加不了的问题&#xff0c;可以按照下面的方法来操作了。适用于windows7windows8、windows10操作系统。在同一个局域网中&#xff0c;你通过192.168.1.1200或网上邻居不能访问对方主机共享文件夹时&#xff0c;按下面的方法操作&#xff…