Python 如何使用QPainter在QScrollara上绘制线?

Python 如何使用QPainter在QScrollara上绘制线?,python,pyqt,pyqt5,qpainter,qscrollarea,Python,Pyqt,Pyqt5,Qpainter,Qscrollarea,我正在尝试使用PyQt5创建一个数据结构可视化模拟器。里面有一个QWidget和一个QScrollara class test(QWidget): def __init__(self): super().__init__() ... ... self.setUI() def setUI(self): self.setGeometry(250, 200, 1500, 750) s

我正在尝试使用PyQt5创建一个数据结构可视化模拟器。里面有一个QWidget和一个QScrollara

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)

paintEvent由实际要绘制的小部件接收,您不能从另一个小部件实现它,即使它是其父部件;您需要对scrollarea进行子类化并从中实现paintEvent,或者使用事件过滤器截获事件。 在这两种情况下,画师目标必须是滚动区域的

子类化:

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)