Qt,并且通过扩展,PyQtPySide提供了基于该控件的属性来设置控件样式的功能。

例如,您可以根据是否点击按钮,或者您设置的任何其他任意属性来设置不同风格的按钮。

动态属性

Qt通过使用setProperty方法支持对象的自定义属性。

QObject.setProperty('PropertyName', value)

通常你想限制这只是布尔值 ,但它支持任何可以像字符串或int等设置到QVariant东西上。
如果你想在widget上存储属性,这真的很方便,但是当你想用它来切换对象的样式表样式时,这非常有用,因为我的文章的其余部分将有希望展示。

QStylesheets

Qt样式表是相当于Web上的CSS
Qt使用了一个类似的盒子模型,对于属性web开发的朋友来说,你可以直接参考CSS示例。

这是一个使用红色字体颜色和黑色背景制作按钮的示例:

QPushButton{
 color: #F00;
 background-color: #000;
}

您可以在这里阅读更多关于它们的信息: http://doc.qt.io/qt-5/stylesheet-examples.html

但真正方便的是样式表可以与动态属性相结合来完成基于属性选择器的样式。

因此,例如,我想只有在Test属性为True时才具有上述内容

QPushButton[Test=true] {...}

你可能想知道为什么true是小写。 这是因为Qt是一个C++应用程序,true是小写字母。

如果我只希望它影响一个对象名称为StyledButton的按钮,并且只有当该状态为True时才如此?

QPushButton#StyledButton[Test=true] {...}

因此,将所有样式定义在一个地方,然后稍后更新属性并调用更新函数会非常有用。

更新属性更改

不幸的是,Qt不会自动将属性更改挂接到样式更改,因此您需要在之后调用简单的更新函数。
这非常简单,您可以通过两种方式来完成此操作:

# Option 1
myWidget.setStyle(myWidget.style())

#OR

# Option 2
myWidget.style().unpolish(myWidget)
myWidget.style().polish(myWidget)
myWidget.update()

我个人更喜欢第一个,因为它是一次操作,但是在这里你只需要提供两个选项,以防你对过程有更多的控制。

把它放在一起

你可以运行这个代码。
它将生成一个带有两个按钮的QDialog
此示例中的样式表在Test = true时影响两个按钮,但另外影响与另一个名称不同的名称为StyledButton的按钮。
由于样式继承,StyledButton继承了Test = True的通用按钮的样式,但它自己的覆盖

这个例子使用PyQt4,但PyQt5,PySide,PySide2等也是如此。
如果您使用的是Qt5绑定(PyQt5PySide2),则需要使用QtWidgets而不是QtGui

class Test(QtGui.QDialog):
    """A sample widget to show dyanmic properties with stylesheets"""
    def __init__(self):
        # Do the usual
        super(Test, self).__init__()
        self.setWindowTitle('Style Sheet Test')
        layout = QtGui.QVBoxLayout(self)

        # Set the stylesheet
        self.setStyleSheet("""
            QPushButton[Test=true] {
                border: 2px solid #8f8f91;
                border-radius: 6px;
                background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
                                      stop: 0 #f6f7fa, stop: 1 #dadbde);
                min-width: 80px;
            }

            QPushButton#StyledButton[Test=true] {
                color: #F00;
                background-color: #000;
            }
                           """)

        # Create the button
        btn = QtGui.QPushButton('Click Me')
        btn.setProperty('Test', True)
        btn.setObjectName('StyledButton')
        btn.clicked.connect(lambda: self.toggle(btn))
        layout.addWidget(btn)

        btn2 = QtGui.QPushButton('Click Me')
        btn2.setProperty('Test', True)
        btn2.clicked.connect(lambda: self.toggle(btn2))
        layout.addWidget(btn2)

    def toggle(self, widget):
        # Query the attribute
        isTest = widget.property('Test').toBool()
        widget.setProperty('Test', not isTest)

        # Update the style
        widget.setStyle(widget.style())

if __name__ == '__main__':
    app = QtGui.QApplication([])
    dlg = Test()
    dlg.show()
    app.exec_()

希望这个小技巧你有用!