PySide中的样式表无法正常工作

时间:2015-08-31 14:19:46

标签: python pyqt pyside qwidget qtstylesheets

我似乎没有让Stylesheets在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_())

结果是:

PySide

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

PyQt4

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

1 个答案:

答案 0 :(得分:2)

对于样式表, testWidget.setAttribute(QtCore.Qt.WA_StyledBackground) 类可能会有不同的处理方式。为了使您的示例正常工作,您需要显式启用样式表,如下所示:

QWidget

然而,我并不完全知道为什么PyQt和PySide在这方面表现不同。这篇来自PyQt作者的邮件列表帖子:

建议只有WA_StyledBackground子类需要设置testWidget属性。事实上,如果class SubWidget(QtGui.QWidget): pass ... testWidget = SubWidget() # testWidget.setAttribute(QtCore.Qt.WA_StyledBackground) 被这样的子类取代:

QWidget

然后该示例不再适用于PyQt或PySide。

这意味着对于QWidget的非子类,PySide行为是错误的。可能存在某种元对象错误,这使得PySide x = {TimeObject[DateObject[{2015, 09, 9, 01, 01, 01}]], TimeObject[DateObject[{2000, 01, 1, 09, 09, 09}]]} 类看起来像Qt的子类。