首页 > 解决方案 > 将 QPainter 与 QScrollArea 一起使用时的工件

问题描述

我正在尝试使用QPainterQScrollArea.

虽然我成功了,但当我向上或向下滚动时,绘图会被伪影扭曲:

在此处输入图像描述

下面是一个最小的可重现示例:

from PyQt5 import QtWidgets, QtGui, QtCore

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.setFixedHeight(200)
        self.setFixedWidth(200)

        w = QtWidgets.QWidget()
        layout = QtWidgets.QVBoxLayout()
        w.setLayout(layout)
        self.setCentralWidget(w)

        scroll = QtWidgets.QScrollArea()
        layout.addWidget(scroll)

        scrollLayout = QtWidgets.QVBoxLayout()
        scrollW = QtWidgets.QWidget()

        scrollW.setLayout(scrollLayout)
        scrollLayout.setAlignment(QtCore.Qt.AlignTop)

        scroll.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
        scroll.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
        scroll.setWidgetResizable(True)
        scroll.setWidget(scrollW)

        label = QtWidgets.QLabel()
        canvas = QtGui.QPixmap(400, 300)
        label.setPixmap(canvas)
        scrollLayout.addWidget(label)

        def paintEvent():
            painter = QtGui.QPainter(label.pixmap())
            painter.setRenderHint(QtGui.QPainter.Antialiasing)
            painter.setPen(QtCore.Qt.red)
            painter.setBrush(QtCore.Qt.white)
            painter.drawArc(0, 0, 100, 100, 1440, -2880)
            painter.end()

        paintEvent()

        self.show()

app = QtWidgets.QApplication([])
window = MainWindow()
app.exec_()

我该如何解决这个问题?

标签: pythonpython-3.xpyqtpyqt5

解决方案


这个问题可以通过使QPixmap区域透明来解决:

canvas.fill(QtCore.Qt.transparent)

推荐阅读