PyQt5:屏蔽QPushButton的反序列化失败

2024-06-02 05:28:55 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑以下最小示例:

import sys

from PyQt5 import QtCore, QtGui, QtWidgets


class FooPushButton(QtWidgets.QPushButton):
    def __init__(self):
        super().__init__()

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

        self.setMask(QtGui.QRegion(self.rect(), QtGui.QRegion.Ellipse))

    def paintEvent(self, event: QtGui.QPaintEvent):
        painter = QtGui.QPainter(self)
        painter.setRenderHint(QtGui.QPainter.Antialiasing)

        pen = QtCore.Qt.NoPen
        brush = QtGui.QBrush(QtCore.Qt.red)

        painter.setPen(pen)
        painter.setBrush(brush)

        painter.drawEllipse(self.rect())

        painter.end()


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

        graphicsScene = QtWidgets.QGraphicsScene()
        graphicsScene.addWidget(FooPushButton())

        graphicsView = QtWidgets.QGraphicsView()
        graphicsView.setScene(graphicsScene)

        self.setCentralWidget(graphicsView)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)

    mainWindow = MainWindow()
    mainWindow.show()

    sys.exit(app.exec())

但是,这会将圆QPushButton渲染为QGraphicsScene, 不遵守抗锯齿渲染提示。删除对setMask的调用会导致抗锯齿再次工作。我想这是因为反走样实际上并没有应用到屏蔽操作产生的可见按钮边框上。你知道吗

我怎样才能解决这个问题?你知道吗


Tags: importselfinitdefsysclasssuperpainter