Рассмотрим следующий минимальный пример:
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
снова вызывает сглаживание.Я предполагаю, что это потому, что сглаживание на самом деле не применяется к границе видимой кнопки в результате операции маскирования.
Как обойти это?