如何使用 PySide 将可检查样式表属性应用于多个 QPushButton?

How do I apply checkable stylesheet properties to multiple QPushButtons with PySide?

我在 Linux 框 (Ubuntu 16.04) 上 Python 3.5 和 PySide 1.2.2。

如果我有不可检查的 QPushButtons,并且我只设置样式 sheet 一次,按钮将以我想要的方式出现。然而,如果我让它们可检查,Qt 想要使用集中和不集中的风格,优先考虑那些我要求的东西。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys
import os

from PySide.QtCore import *
from PySide.QtGui  import *

class UI(QDialog):

    def __init__(self, *args, **kwargs):
        super(UI, self).__init__(**kwargs)

        outerBox = QGroupBox(self)
        outerBox.setGeometry(50, 50, 200, 150)
        outerBox.setObjectName("outerBox")

        brokenCss  = "QPushButton:unchecked {"
        brokenCss += "  background-color:  #ce9a9a;"  # red-ish
        brokenCss += "  border: 1px outset #000000;"
        brokenCss += "  border-radius: 6px;"
        brokenCss += "}"
        brokenCss += "QPushButton:checked {"
        brokenCss += "  background-color:  #12f785;"  # green-ish
        brokenCss += "  border: 1px inset  #000000;"
        brokenCss += "  border-radius: 6px;"
        brokenCss += "}"

        broken = []
        for i in range(2):
            broken.append(QPushButton(outerBox))
            broken[i].setObjectName("broken{0}".format(i))
            broken[i].setGeometry(15, (35 * (i + 1)), 100, 20)
            broken[i].setText("Broken CSS {0}".format(i))
            broken[i].setCheckable(True)
            broken[i].setChecked(False)
            broken[i].setStyleSheet(brokenCss)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ui = UI()
    ui.showFullScreen()
    sys.exit(app.exec_())

我希望上面的代码会在启动时产生两个红色按钮,然后它们会变成绿色并在按下一次后保持绿色(再次单击时会翻转回红色) .相反,我看到:

一旦它们都被点击,它们都会变成绿色,但我猜最近点击的颜色稍微深一点,表示焦点。但是将它们切换回关闭状态会再次显示上面的图像,而不是两个红色按钮。

我尝试为 :default:flat 和其他几个伪状态添加 CSS "stanzas",但都无济于事。

显然,文档与实际情况不符。 uncheckedchecked 是做我想做的事情的记录方式,但是在尝试了同样无效的 offon 之后,我尝试了 closedopen,据我从文档中了解到,它应该只适用于附加菜单的 QPushButtons。尽管如此,这还是奏效了。 (它似乎没有做 outsetinset 但它使颜色正确。)

我也切换到 PyQt5 看看是否会有变化,但它的行为与 PySide 相同。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys
import os

from PySide.QtCore import *
from PySide.QtGui  import *

class UI(QDialog):

    def __init__(self, *args, **kwargs):
        super(UI, self).__init__(**kwargs)

        outerBox = QGroupBox(self)
        outerBox.setGeometry(50, 50, 200, 150)
        outerBox.setObjectName("outerBox")

        brokenCss  = "QPushButton:closed {"
        brokenCss += "  background-color:  #ce9a9a;"  # red-ish
        brokenCss += "  border: 1px outset #000000;"
        brokenCss += "  border-radius: 6px;"
        brokenCss += "}"
        brokenCss += "QPushButton:open {"
        brokenCss += "  background-color:  #12f785;"  # green-ish
        brokenCss += "  border: 1px inset  #000000;"
        brokenCss += "  border-radius: 6px;"
        brokenCss += "}"

        broken = []
        for i in range(2):
            broken.append(QPushButton(outerBox))
            broken[i].setObjectName("broken{0}".format(i))
            broken[i].setGeometry(15, (35 * (i + 1)), 100, 20)
            broken[i].setText("Broken CSS {0}".format(i))
            broken[i].setCheckable(True)
            broken[i].setChecked(False)
            broken[i].setStyleSheet(brokenCss)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ui = UI()
    ui.showFullScreen()
    sys.exit(app.exec_())