PySide 中的样式表不起作用

Stylesheet in PySide not working

我似乎没有让样式表在 PySide 中工作。是否有一些不同于 PyQt 的特殊语法?

这是一个小示例代码:

import sys
from PySide import QtGui

class Example(QtGui.QWidget):
    def __init__(self):
        super(Example, self).__init__()
        self.initUI()

    def initUI(self):
        okButton = QtGui.QPushButton("OK")
        cancelButton = QtGui.QPushButton("Cancel")
        testWidget = QtGui.QWidget()
        hbox2 = QtGui.QHBoxLayout()
        hbox2.addWidget(okButton)
        testWidget.setLayout(hbox2)
        testWidget.setObjectName("testWidget")
        testWidget.setStyleSheet("QWidget#testWidget { \n     border: 2px solid gray; \n     border-radius: 3px; \n }")
        hbox = QtGui.QHBoxLayout()
        hbox.addWidget(testWidget)
        hbox.addWidget(cancelButton)

        self.setLayout(hbox)    
        self.setGeometry(300, 300, 300, 150)
        self.setWindowTitle('Expample')    
        self.show()

app = QtGui.QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())

结果是:

如果我将 from PySide import QtGui 更改为 from PyQt4 import QtGui,我将收到以下结果:

为什么样式表在 PySide 中不起作用?

QWidget class 在涉及样式表时可能会有不同的处理方式。为了使您的示例正常工作,您需要像这样显式启用样式表:

    testWidget.setAttribute(QtCore.Qt.WA_StyledBackground)

但是,我不太清楚为什么 PyQt 和 PySide 在这方面表现不同。这个邮件列表 post 来自 PyQt 的作者:

表示只有 QWidgetsubclasses 需要设置 WA_StyledBackground 属性。事实上,如果 testWidget 被这样的 subclass:

取代
class SubWidget(QtGui.QWidget): pass
...
testWidget = SubWidget()        
# testWidget.setAttribute(QtCore.Qt.WA_StyledBackground)

然后该示例在 PyQt 或 PySide 中不再有效。

这意味着 PySide 行为对于 QWidget 的非子 class 是错误的。可能存在某种元对象错误,使 PySide QWidget class 看起来像是 Qt 的子class。