我正在编写一个模拟GUI,其中QtPainter在打开窗户时立即绘制一个Pixmap。 我使用了不同的按钮,这些按钮应该导致在像素图的上方绘画(线条和其他几何形式)
我尝试编写以QtPainter对象作为参数并使用button.clicked.connect()调用函数的函数,但是图形从不出现在屏幕上。 由于我是PyQt的新手,所以我不确定它的工作方式,但是我想只能通过调用paintEvent()函数来绘画,但是如果我在paintEvent()中编写所有几何形式,如何确保它们仅出现当按下按钮时?
答案 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()