我正在尝试使用PyQt5创建一个数据结构可视化模拟器。里面有一个QWidget和一个QScrollArea。
class test(QWidget):
def __init__(self):
super().__init__()
...
...
self.setUI()
def setUI(self):
self.setGeometry(250, 200, 1500, 750)
self.setWindowTitle('data structure visualization simulator')
self.topFiller = QWidget()
self.topFiller.setMinimumSize(1200, 2000)
self.scroll = QScrollArea()
self.scroll.setWidget(self.topFiller)
self.vbox = QVBoxLayout()
self.vbox.addWidget(self.scroll)
self.setLayout(self.vbox)
现在我需要在QScrollArea上画线,我应该在QPainter中写些什么?
def paintEvent(self, e):
qp = QPainter(self)
pen = QPen()
pen.setWidth(1)
qp.setPen(pen)
qp.drawLine(15, 80, 1080, 120)
答案 0 :(得分:0)
paintEvent由实际要绘制的窗口小部件接收,您不能从另一个窗口小部件实现它,即使它是其父窗口也是如此。您需要子类化scrollarea并从那里实现paintEvent,或者使用事件过滤器拦截事件。
在这两种情况下,绘制者目标都必须是滚动区域的viewport()
。
子类化:
class MyScrollArea(QScrollArea):
def paintEvent(self, event):
qp = QPainter(self.viewport())
pen = QPen()
pen.setWidth(1)
qp.setPen(pen)
qp.drawLine(15, 80, 1080, 120)
事件过滤:
class test(QWidget):
def setUI(self):
# ...
# install the event filter on the area's *viewport*
self.scroll.viewport().installEventFilter(self)
def eventFilter(self, source, event):
if event.type() == QEvent.Paint:
super().eventFilter(source, event)
# "source" is the viewport
qp = QPainter(source)
pen = QPen()
pen.setWidth(1)
qp.setPen(pen)
qp.drawLine(15, 80, 1080, 120)
return False
return super().eventFilter(source, event)