⽂本涂鸦
写⼀些⽂本上下居中对齐的俄罗斯Cylliric语⾔的⽂字
import sys
from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtGui import QPainter, QColor, QFont
from PyQt5.QtCore import Qtclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.text = "Лев Николаевич Толстой\nАнна Каренина"self.setGeometry(300, 300, 280, 170)self.setWindowTitle('Drawing text')self.show()def paintEvent(self, event): # 重载⽅法# QPainter 是低级的绘画类。所有的绘画动作都在这个类的 begin() 和 end() ⽅法之间完成# 绘画动作都封装在 drawText() 内部qp = QPainter()qp.begin(self)self.drawText(event, qp)qp.end()def drawText(self, event, qp):qp.setPen(QColor(168, 34, 3))qp.setFont(QFont('Decorative', 10))# 为⽂字绘画定义了笔和字体# drawText() ⽅法在窗⼜⾥绘制⽂本, rect() ⽅法返回要更新的矩形区域qp.drawText(event.rect(), Qt.AlignCenter, self.text)if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()app.exec_()
注:
当发生以下情况时会产生绘制事件并调用paintEvent()函数:
- 在窗口部件第一次显示时,系统会自动产生一个绘图事件,从而强制绘制这个窗口部件。(也 就是说程序开启时就直接触发了)
- 当重新调整窗口部件的大小时,系统也会产生一个绘制事件。
- 当窗口部件被其他窗口部件遮挡,然后又再次显示出来的时候,就会对那些隐藏的区域产生一 个绘制事件
同时可以调⽤QWidget::update()或者QWidget::repaint()来强制产⽣⼀个绘制事件。
⼆者的区别是:
repaint()函数会强制产⽣⼀个即时的重绘事件,⽽update()函数只是在Qt下⼀次处理事件时才调
⽤⼀次绘制事件。如果多次调⽤update(),Qt会把连续多次的绘制事件压缩成⼀个单⼀的绘制事件,
这样可避免闪烁现象。
点的绘画
点是最简单的绘画
from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtGui import QPainter
from PyQt5.QtCore import Qt
import sys, randomclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setGeometry(300, 300, 300, 190)self.setWindowTitle('Points')self.show()def paintEvent(self, e): # 程序启动⾃动调⽤qp = QPainter()qp.begin(self)self.drawPoints(qp)qp.end() # end就不⽤加selfdef drawPoints(self, qp):# 设置笔的颜⾊为红⾊qp.setPen(Qt.red)# 每次更改窗⼜⼤⼩,都会产⽣绘画事件,从 size() ⽅法⾥获得当前窗⼜的⼤⼩,# 然后把产⽣的点随机的分配到窗⼜的所有位置上size = self.size()for i in range(1000):x = random.randint(1, size.width() - 1)y = random.randint(1, size.height() - 1)qp.drawPoint(x, y)if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()app.exec_()
颜色
颜⾊是⼀个物体显⽰的RGB的混合⾊。RBG值的范围是0~255。我们有很多⽅式去定义⼀个颜⾊,
最常见的⽅式就是RGB和16进制表⽰法,也可以使⽤RGBA,增加了⼀个透明度的选项,透明度值
的范围是0~1,0代表完全透明
from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtGui import QPainter, QColor, QBrush
import sysclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setGeometry(300, 300, 350, 100)self.setWindowTitle('Colours')self.show()def paintEvent(self, e): # 程序启动⾃动调⽤qp = QPainter()qp.begin(self)self.drawRectangles(qp)qp.end()def drawRectangles(self, qp):col = QColor(0, 0, 0)# 设置边框的颜⾊col.setNamedColor('#d4d4d4')qp.setPen(col)qp.setBrush(QColor(200, 0, 0))# drawRect() 有四个参数,分别是矩形的x、y、w、hqp.drawRect(10, 15, 90, 60)qp.setBrush(QColor(255, 80, 0, 160))qp.drawRect(130, 15, 90, 60)qp.setBrush(QColor(25, 0, 90, 200))qp.drawRect(250, 15, 90, 60)if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()app.exec_()
QPen
QPen 是基本的绘画对象,能⽤来画直线、曲线、矩形框、椭圆、多边形和其他形状
⽤不同的笔画直线
from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtGui import QPainter, QPen
from PyQt5.QtCore import Qt
import sysclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setGeometry(300, 300, 280, 270)self.setWindowTitle('Pen styles')self.show()def paintEvent(self, e): # 程序启动⾃动调⽤qp = QPainter()qp.begin(self)self.drawLines(qp)qp.end()def drawLines(self, qp):pen = QPen(Qt.black, 2, Qt.SolidLine) # 先设置笔的样式qp.setPen(pen) # 有种插上笔芯的感觉qp.drawLine(20, 40, 250, 40) # 前两个坐标起点 后两个坐标终点pen.setStyle(Qt.DashLine)qp.setPen(pen)qp.drawLine(20, 80, 250, 80)pen.setStyle(Qt.DashDotLine)qp.setPen(pen)qp.drawLine(20, 120, 250, 120)pen.setStyle(Qt.DotLine)qp.setPen(pen)qp.drawLine(20, 160, 250, 160)pen.setStyle(Qt.DashDotDotLine)qp.setPen(pen)qp.drawLine(20, 200, 250, 200)pen.setStyle(Qt.CustomDashLine)pen.setDashPattern([1, 4, 5, 4])qp.setPen(pen)qp.drawLine(20, 240, 250, 240)if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()app.exec_()
PyQt5有五个预定义的笔,另外⼀个笔的样式是⾃定义的
QBrush
QBrush 也是图像的⼀个基本元素。是⽤来填充⼀些物体的背景图⽤的,⽐如矩形,椭圆,多边形
等。
有三种类型:
- 预定义
- 渐变
- 纹理
from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtGui import QPainter, QBrush
from PyQt5.QtCore import Qt
import sysclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setGeometry(300, 300, 355, 280)self.setWindowTitle('Brushes')self.show()def paintEvent(self, e):qp = QPainter()qp.begin(self)self.drawBrushes(qp)qp.end()def drawBrushes(self, qp):brush = QBrush(Qt.SolidPattern)qp.setBrush(brush)qp.drawRect(10, 15, 90, 60) # 这⾥后两位貌似是⻓和⾼brush.setStyle(Qt.Dense1Pattern)qp.setBrush(brush)qp.drawRect(130, 15, 90, 60)brush.setStyle(Qt.Dense2Pattern)qp.setBrush(brush)qp.drawRect(250, 15, 90, 60)brush.setStyle(Qt.DiagCrossPattern)qp.setBrush(brush)qp.drawRect(10, 105, 90, 60)brush.setStyle(Qt.Dense5Pattern)qp.setBrush(brush)qp.drawRect(130, 105, 90, 60)brush.setStyle(Qt.Dense6Pattern)qp.setBrush(brush)qp.drawRect(250, 105, 90, 60)brush.setStyle(Qt.HorPattern)qp.setBrush(brush)qp.drawRect(10, 195, 90, 60)brush.setStyle(Qt.VerPattern)qp.setBrush(brush)qp.drawRect(130, 195, 90, 60)brush.setStyle(Qt.BDiagPattern)qp.setBrush(brush)qp.drawRect(250, 195, 90, 60)if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()app.exec_()
创建了⼀个笔刷对象,添加笔刷样式
贝塞尔曲线
噩梦可以使⽤PyQt5的 QPainterPath 创建贝塞尔曲线。绘画路径是由许多构建图形的对象,具体表
现就是⼀些线的形状,⽐如矩形,椭圆,线和曲线
from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtGui import QPainter, QPainterPath
from PyQt5.QtCore import Qt
import sysclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setGeometry(300, 300, 380, 250)self.setWindowTitle('Bézier curve')self.show()def paintEvent(self, e):qp = QPainter()qp.begin(self)qp.setRenderHint(QPainter.Antialiasing)self.drawBezierCurve(qp)qp.end()def drawBezierCurve(self, qp):path = QPainterPath()path.moveTo(30, 30)path.cubicTo(30, 30, 200, 350, 350, 30)qp.drawPath(path)if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()app.exec_()
⽤ QPainterPath 路径创建贝塞尔曲线。使⽤ cubicTo() ⽅法⽣成,分别需要三个点:起始点,控
制点和终⽌点