QGraphicsView/QGraphicsScene 中的按钮无法正确绘制

Buttons in QGraphicsView/ QGraphicsScene not painting correctly

当我将按钮放入场景和 QGraphicsView 中时,按钮右侧的区域错误地变为灰色。

我可以在 Windows 和 Linux 中复制它。有什么技巧可以摆脱这个不需要的功能吗?

from PyQt5.QtWidgets import (QApplication, QGraphicsView, QGraphicsScene,
                             QPushButton, QLabel)
from PyQt5.QtCore import (Qt, QRectF)
from PyQt5 import QtCore


class MyView(QGraphicsView):
    
    def __init__(self, parent = None):

        super(MyView, self).__init__(parent)
              
        self.button1 = QPushButton('Button1')
        self.button1.setGeometry(-60, -60, 80, 40)
        self.button2 = QPushButton('Button2')
        self.button2.setGeometry(10, 10, 80, 40)
        version  = 'PYQT_VERSION_STR: ' + QtCore.PYQT_VERSION_STR + '\n'
        version += 'QT_VERSION_STR: ' + QtCore.QT_VERSION_STR + '\n'
        self.label = QLabel(version)
        self.label.setGeometry(-100, 80, 160, 80)
        
        self.setScene(QGraphicsScene())
        self.scene().addWidget(self.button1)
        self.scene().addWidget(self.button2)
        self.scene().addWidget(self.label)
        
        self.scene().setSceneRect(QRectF(-150, -150, 300, 300))

if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)
    widget = MyView()
    widget.show()
    

    sys.exit(app.exec_())

当一个小部件被添加到图形场景时,它的代理使用小部件的 minimumSizeHint() 作为其几何的最小尺寸,无论您是否将小部件调整到更小的尺寸(我不不知道这是错误还是设计使然)。

结果如下:

  • 您不能将代理的几何设置小于源小部件的最小尺寸[提示];
  • 将小部件的大小调整为小于最小大小[提示]只会调整小部件的大小,但代理仍将使用该最小大小[提示];

例如,QPushButton 的最小尺寸提示约为 80x30(实际值取决于所使用的样式和字体),因此即使您将按钮的尺寸调整为更小的尺寸,其代理仍将是 80x30 .

为避免这种情况,您可以手动将小部件的最小大小设置为合理的值,或者子类化小部件并覆盖 minimumSizeHint()