PyQt5之窗口绘图类控件QPainter
QPainter类在QWidget上执行绘图操作,它是一个绘图工具,为大部分图形界面提供了高度优化的函数,绘制操作在
QWidget.paintEvent() 中完成。绘制方法必须放在QtGui.QPainter 对象的begin() 和end() 之间。
一、QPainter类中的常用方法
| 方法 | 描述 |
|---|---|
| begin() | 开始在目标设备上绘制 |
| drawArc() | 在起始角度和最终角度之间画弧 |
| drawEllipse() | 在一个矩形内画一个椭圆 |
| drawLine(int x1,int y1,int x2,int y2) | 绘制一条指定了端点坐标的线 |
| drawPixmap() | 从图像文件中提取Pixmap并将其显示在指定的位置 |
| drawPolygon() | 使用坐标数组绘制多边形 |
| drawRect(int x,int y,int w,int h) | 以给定的高度和宽度从左上角坐标(x,y)绘制一个矩形 |
| drawText() | 显示给定坐标处的文字 |
| fillRect() | 使用QColor参数填充矩形 |
| setBrush() | 设置画笔风格 |
| setPen() | 设置用于绘制的笔的颜色、大小和样式 |
二、画笔风格
| 枚举类型 | 描述 |
|---|---|
| Qt.NoPen | 没有线 |
| Qt.SolidLine | 一条简单的线 |
| Qt.DashLine | 由一些像素分隔的短线 |
| Qt.DotLine | 由一些像素分隔的点 |
| Qt.DashDotLine | 轮流交替的点和短线 |
| Qt.DashDotDotLine | 一条短线,两个点 |
| Qt.MPenStyle | 画笔风格的掩码 |
三、绘制文字
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | import sys from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * class Win(QWidget): def __init__(self): super().__init__() self.setGeometry(200, 200, 400, 400) self.setWindowTitle('在窗口中绘制文字') self.text = "Hello Python" 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) form = Win() form.show() sys.exit(app.exec_()) |
运行效果如下:

四、绘制点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | import sys,math from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * class Win(QWidget): def __init__(self): super().__init__() self.setGeometry(200, 200, 400, 400) self.setWindowTitle('在窗口中绘制点') def paintEvent(self, event): painter = QPainter() painter.begin(self) #自定义绘制方法 self.drawPoints(painter) painter.end() def drawPoints(self,painter): painter.setPen(Qt.red)#设置画笔的颜色 size = self.size() for i in range(1000): x = 100*(-1+2.0*i/1000) + size.width()/2.0 y = -50*math.sin((x-size.width()/2.0)*math.pi/50) + size.height()/2.0 painter.drawPoint(x,y) if __name__ == "__main__": app = QApplication(sys.argv) form = Win() form.show() sys.exit(app.exec_()) |
运行效果如下:
