十、窗口绘图类控件
- 在 PyQt5中,一般可以通过 QPainter,QPen和 QBrush 这三个类来实现绘图功能。此外,QPixmap的作用是加载并呈现本地图像,而图像的呈现本质上也是通过绘图方式实现的,所以 QPixmap也可以被视为绘图的一个类。
1、QPainter
- QPainter类在 QWidget(控件)上执行绘图操作,它是一个绘制工具,为大部分图形界面提供了高度优化的函数,使QPainter类可以绘制从简单的直线到复杂的饼图等。
- 绘制操作在 QWidget.paintEvent()中完成。绘制方法必须放在QtGui.QPainter对象的begin()和 end()之间。QPainter类在控件或其他绘图设备上执行较低级别的图形绘制功能。
- QPainter类中常用的方法
方法 |
描述 |
begin() |
开始在目标设备上绘制 |
drawArc() |
在起始角度和最终角度之间画弧 |
drawEllipse |
在一个矩形内画一个椭圆 |
drawLine(int x1, int y1, int x2, int y2) |
绘制一条指定了端点坐标的线。绘制从(x1, y1)到(x2, y2)的直线并且设置当前画笔位置为(x2, y2) |
drawPixmap() |
从图像文件中提取Pixmap并将其显示在指定的位置 |
drawPolygon() |
使用坐标数组绘制多边形 |
drawRect(int x,int y,int w,int h) |
以给定的宽度w和高度h从左上角坐标(x,y)绘制一个矩形 |
drawText() |
显示给定坐标处的文字 |
fillRect() |
使用QColor参数填充矩形 |
setBrush() |
设置画笔风格 |
setPen() |
设置用于绘制的笔的颜色、大小和样式 |
枚举类型 |
描述 |
Qt.NoPen |
没有线。比如 QPainter.drawRect()填充,但没有绘制任何边界线 |
Qt.SolidLine |
一条简单的线 |
Qt.DashLine |
由一些像素分隔的短信 |
Qt.DotLine |
由一些像素分隔的点 |
Qt.DashDotLine |
轮流交替的点和短线 |
Qt.DashDotDotLine |
一条短线、两个点 |
Qt.MPenStyle |
画笔风格的掩码 |
案例二十五 绘制文字
"""
# @Time:2022/12/9 0009 19:55
# @Author:晚秋拾叶
# @File:qt04_drawText.py
# @PyCharm之Python
"""
import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QPainter, QColor, QFont
from PyQt5.QtCore import Qt
class Drawing(QWidget):
def __init__(self, parent=None):
super(Drawing, self).__init__(parent)
self.setWindowTitle("在窗口中绘制文字")
self.resize(750, 200)
self.text = "愚钝半生无羁客,飘零晚秋拾落叶"
def paintEvent(self, event):
painter = QPainter(self)
painter.begin(self)
self.drawText(event, painter)
painter.end()
def drawText(self, event, qp):
qp.setPen(QColor(168, 34, 3))
qp.setFont(QFont('SimSun', 20))
qp.drawText(event.rect(), Qt.AlignCenter, self.text)
if __name__ == '__main__':
app = QApplication(sys.argv)
win = Drawing()
win.show()
sys.exit(app.exec_())
- 代码分析
- 首先定义要绘制的文字(其实是有屏幕上的一个个点point组成的),然后定义绘制事件,所有的绘制操作都发生在此事件内。代码如下
def paintEvent(self, event):
painter = QPainter(self)
painter.begin(self)
self.drawText(event, painter)
painter.end()
- QtGui.QPainter类负责所有低级别的绘制,所有的绘制方法都要放在begin()和end()之间。
- 下面是自定义的drawText()方法
def drawText(self, event, qp):
qp.setPen(QColor(168, 34, 3))
qp.setFont(QFont('simSun'