如何使用 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",但都无济于事。
显然,文档与实际情况不符。 unchecked
和 checked
是做我想做的事情的记录方式,但是在尝试了同样无效的 off
和 on
之后,我尝试了 closed
和 open
,据我从文档中了解到,它应该只适用于附加菜单的 QPushButtons。尽管如此,这还是奏效了。 (它似乎没有做 outset
和 inset
但它使颜色正确。)
我也切换到 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_())
我在 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",但都无济于事。
显然,文档与实际情况不符。 unchecked
和 checked
是做我想做的事情的记录方式,但是在尝试了同样无效的 off
和 on
之后,我尝试了 closed
和 open
,据我从文档中了解到,它应该只适用于附加菜单的 QPushButtons。尽管如此,这还是奏效了。 (它似乎没有做 outset
和 inset
但它使颜色正确。)
我也切换到 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_())