官方文档:https://doc.qt.io/qtforpython/PySide2/QtGui/QPainter.html
QPainter是Qt中一个方便的绘图类,下面以“为界面填充背景”为例,说明一下QPainter使用时需要注意的点
先给出完整程序,其中’try/video_1.ui’是提前用designer写好的一个ui文件,'icon/bg_2.jpg’是一张背景图:
import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QPainter,QPixmap
from PyQt5 import uic
class Winform(QWidget):
def __init__(self):
super(Winform, self).__init__()
self.ui = uic.loadUi('try/video_1.ui', baseinstance=self)
def paintEvent(self, event):
print("调用paintEvent成功!")
painter = QPainter(self)
painter.drawPixmap(self.rect(), QPixmap('icon/bg_2.jpg'))
if __name__ == "__main__":
app = QApplication(sys.argv)
form = Winform()
form.show()
sys.exit(app.exec_())
1. 继承QWidget
根据上面官方文档的描述,想使用QPainter需要在paintEvent中写入相应功能,即重写该函数。该事件是可以自动触发一次的。我们自然需要对QWidget进行继承,不然是没法触发paintEvent事件的~
class Winform(QWidget):
super(Winform, self).__init__()
2. uic.loadUi
使用uic.loadUi函数时,需要指定参数baseinstance=self,正如上面所述,这可以保证ui被创建在当前实例下(而非创建一个新实例),否则,paintEvent是无法触发的
3. painter=QPainter(self)
类似地,实例化QPainter时也需要指定当前实例“self”,否则虽然paintEvent能被触发,但是不会作用到当前实例上,无法完成paint任务
所以,在使用QPainter时,既需要通过继承和重写来自动触发paintEvent事件,又需要注意将ui和painter作用到当前实例中!程序效果如下~