在PyQt5中,一般可以通过Qpainter,QPen,QBrush这三个类来实现绘图功能,此外,QPixmap的作用是加载并呈现本地图像,而图像的本质上也是通过绘图方式实现的,所以QPixmap也可以被视为绘图的一个类
Qpainter类在QWidget(控件)上执性绘图操作,它是一个绘制工具,为大部分图形化界面提供了高度优化的函数,使QPainter类可以绘制从简单的直线到复杂的饼图等
绘制操作在QWidget.paintEvent()中完成,绘制方法必须放在QtGui.QPainter对象的begin()和end()之间。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 | 画笔风格的掩码 |
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(300,200)
self.text='欢迎学习 PyQt5'
def paintEvent(self,event):
painter=QPainter()
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)
demo=Drawing()
demo.show()
sys.exit(app.exec_())
在这个例子里,首先定义了待绘制的文字,然后定义了一个绘制事件,所有的绘制操作都发生在此事件内,
self.text='欢迎学习 PyQt5'
def paintEvent(self,event):
painter=QPainter()
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',20))
#绘制文字
qp.drawText(event.rect(),Qt.AlignCenter,self.text)
import sys,math
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class Drawing(QWidget):
def __init__(self,parent=None):
super(Drawing,self).__init__(parent)
self.resize(300,200)
self.setWindowTitle('在窗口画点')
def paintEvent(self,event):
#初始化绘图工具
qp=QPainter()
#开始在窗口绘制
qp.begin(self)
#自定义画点方法
self.drawPoints(qp)
#结束在窗口的绘制
qp.end()
def drawPoints(self,qp):
qp.setPen(Qt.red)
size=self.size()
for i in range(1000):
#绘制郑玄函数图像,它的周期是【-100,100】
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
qp.drawPoint(x,y)
if __name__ == '__main__':
app=QApplication(sys.argv)
demo=Drawing()
demo.show()
sys.exit(app.exec_())
在这个例子中,在窗口的工作区绘制正弦函数图形,周期是【-100,100】
for i in range(1000):
#绘制郑玄函数图像,它的周期是【-100,100】
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
qp.drawPoint(x,y)
画笔颜色设置为红色,使用预定义的Qt.red颜色
qp.setPen(Qt.red)
每次调整窗口的大小时,会生成一个绘图事件,使用size()方法得到窗口的当前大小,在新的窗口中随机分布工作区的点
size=self.size()
使用drawPoint()方法绘制一个个点
qp.drawPoint(x,y)
源码以及相关文件下载:https://download.csdn.net/download/jia666666/10597897