在启动UI之后以及以后按下按钮时如何使用QtPainter?

时间:2019-07-03 13:49:31

标签: python pyqt5

我正在编写一个模拟GUI,其中QtPainter在打开窗户时立即绘制一个Pixmap。 我使用了不同的按钮,这些按钮应该导致在像素图的上方绘画(线条和其他几何形式)

我尝试编写以QtPainter对象作为参数并使用button.clicked.connect()调用函数的函数,但是图形从不出现在屏幕上。 由于我是PyQt的新手,所以我不确定它的工作方式,但是我想只能通过调用paintEvent()函数来绘画,但是如果我在paintEvent()中编写所有几何形式,如何确保它们仅出现当按下按钮时?

1 个答案:

答案 0 :(得分:0)

要直接绘制到小部件上,可以覆盖它的paintEvent。这样做时要记住的一点是,paintEvent会在每次小部件认为有必要重绘自身时触发,例如调整大小或移动时。这意味着在实现自己的paintEvent版本时,您需要在小部件上绘制所有要绘制的形状。请注意,paintEvent很少直接调用。如果您希望窗口小部件重新绘制自身,则应调用update(),它将为您安排paintEvent

这是一个简单的示例,其中在单击按钮时将任意矩形添加到画布。矩形存储在Canvas对象的数组中。在Canvas.paintEvent中,我们创建QPainter的实例,并使用此对象绘制数组中的所有矩形。

from PyQt5 import QtWidgets, QtGui, QtCore
from random import randrange

class Canvas(QtWidgets.QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.rectangles = []

    def add_rectangle(self, rect, color):
        self.rectangles.append((rect, color))
        self.update()

    def paintEvent(self, event):
        painter = QtGui.QPainter(self)
        brush = QtGui.QBrush(QtCore.Qt.white)
        painter.setBrush(brush)
        painter.drawRect(event.rect())

        pen = QtGui.QPen()
        pen.setWidth(3)
        for rect, color in self.rectangles:
            pen.setColor(color)
            painter.setPen(pen)
            brush.setColor(color)
            painter.setBrush(brush)
            painter.drawRect(rect)

class MyWindow(QtWidgets.QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.canvas = Canvas(self)
        self.button = QtWidgets.QPushButton('Add rectangle')
        self.button.clicked.connect(self.add_rectangle)

        self.layout = QtWidgets.QVBoxLayout(self)
        self.layout.addWidget(self.canvas)
        self.layout.addWidget(self.button)
        self.resize(500,500)

    def add_rectangle(self):
        w = self.canvas.width()
        h = self.canvas.height()
        x0, y0 = randrange(w), randrange(h)
        x1, y1 = randrange(w), randrange(h)

        shape = QtCore.QRect(min(x0,x1), min(y0,y1), abs(x0-x1), abs(y0-y1))
        color = QtGui.QColor.fromRgb(*(randrange(256) for i in range(3)), 180)
        self.canvas.add_rectangle(shape, color)


if __name__ == "__main__":
    app = QtWidgets.QApplication([])
    window = MyWindow()
    window.show()
    app.exec()