设置按钮的可检查 QPushbutton 的背景颜色被禁用

Setting background-color of a checkable QPushbutton for button is disabled

我尝试设置pushButton.checked()的背景色。如果按钮被启用并且pushButton.checked() == False,它工作正常,它将背景颜色设置为styleSheet()disabled颜色但是如果按钮被禁用并且pushButton.checked() == True它不会改变背景颜色。 我已经尝试了 this post 中的解决方法,但没有成功。其他一些靠近帖子链接。

下面的例子:使用下方按钮启用(禁用上方按钮并使用上方按钮设置它checked/unchecked和enable/disable它与下方按钮一起看到我的意思。背景如果按钮被禁用,应该始终变灰。

是否需要特殊设置或组合?

import sys

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *


class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.setMinimumSize(300,300)
        self.pushButton1 = QPushButton("see css result", self)
        self.pushButton1.setCheckable(True)
        #self.pushButton1.setAutoFillBackground (True)    # mentioned in
        self.pushButton1.setStyleSheet(css_pushButton())
        self.pushButton1.resize (100, 40)
        self.pushButton1.move(50,50)
        print("scc1:", self.pushButton1.styleSheet())

        self.pushButton_control = QPushButton("Button Enabled", self)
        self.pushButton_control.setCheckable(False)
        self.pushButton_control.clicked.connect(self.pushButton_control_clicked)
        self.pushButton_control.move(50,100)
        self.pushButton_control.resize (100, 40)

    def pushButton_control_clicked(self):
        print("Checked:",self.pushButton1.isChecked())
        if self.pushButton1.isEnabled():
            print("set False")
            self.pushButton1.setEnabled(False)
            self.pushButton_control.setText(('DISABLED'))
        else:
            self.pushButton1.setEnabled(True)
            self.pushButton_control.setText(('ENABLED'))
            print("set True")


def css_pushButton():
    css = '''
            QPushButton {
                            font-size: 10px;
                            background-color: green;
                            color: black;
                            border: 2px green;
                            border-radius: 22px;
                            border-style: outset;
                                }
            QPushButton:hover {
                            background: qradialgradient(
                                cx: 0.3, cy: -0.4, fx: 0.3, fy: -0.4,
                                radius: 1.35, stop: 0 grey, stop: 1 lightgray
                                );
                            }
            QPushButton:enabled{
                            color: black;
                            font:  10px;
                            background: green;
                            background-color: red;
                            border: 1px black;
                            border-style: outset;
                            }
            QPushButton:pressed {
                            color: white;
                            background: yellow;
                            }
            QPushButton:disabled {
                            color: gray;
                            background-color: gray;
                            border: 1px black;
                            border-style: outset;                
                        }
            QPushButton:checked{
                        color: black; 
                        font:  12px;   
                        font: bold;
                        background-color: red;
                        border: 1px black;
                        border-style: outset;
                        }
            QPushButton:!checked{
                        color: black; 
                        font:  12px;   
                        font: bold;
                        background-color: green;
                        border: 1px black;
                        border-style: outset;
            }
            
                '''
    return css

if __name__ == "__main__":
    app = QApplication (sys.argv)
    prog = MainWindow()
    prog.show ()
    app.exec_ ()

即使在 OOP 中,对象和属性声明的 顺序 也很重要,因为最后一个优先于前一个。这对样式表也有效。

在您的代码中,:checked:!checked 规则优先于(“覆盖”)之前声明的任何 属性,其中包括 :disabled 中指定的内容。

解决方法很简单:把:disabled块移到最后。

更好的是,使用组合选择器:

            QPushButton:disabled {
                        color: gray;
            }
            QPushButton:disabled:checked {
                        background-color: #ffaaaa;
            }
            QPushButton:disabled:!checked {
                        background-color: lightGreen;
            }

在 Qt 文档中阅读有关 stylesheet conflict resolution 的更多信息。