Pyqt5 检查按钮颜色并更改按钮颜色

Posted

技术标签:

【中文标题】Pyqt5 检查按钮颜色并更改按钮颜色【英文标题】:Pyqt5 Check pushbutton color and change pushbutton color 【发布时间】:2019-11-23 13:35:42 【问题描述】:

我用 PyQt5 创建了一个按钮。按钮的原始背景颜色为灰色。如果它的背景色是灰色,当我按下它时它的背景色会变成红色。如果它的背景颜色是红色,当我按下它时它会变成灰色。 以下是我的代码。

from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(270, 200, 221, 71))
        self.pushButton.setStyleSheet("background-color: gray;")
        self.pushButton.setText("")
        self.pushButton.setObjectName("pushButton")
        self.pushButton.clicked.connect(self.action)
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))

    def action(self):
        if self.pushButton.setStyleSheet["background-color"] == "gray":
            self.pushButton.setStyleSheet("background-color: red;")
        else:
            self.pushButton.setStyleSheet("background-color: gray;")
if __name__ == "__main__":
   import sys
   app = QtWidgets.QApplication(sys.argv)
   MainWindow = QtWidgets.QMainWindow()
   ui = Ui_MainWindow()
   ui.setupUi(MainWindow)
   MainWindow.show()
   sys.exit(app.exec_())

代码在“if”行中有错误。我不知道如何检查按钮背景颜色。 如果我使用 tkinter 创建按钮。我知道如何检查按钮背景颜色。

if self.buttons["bg"] == "gray":

但现在我想知道如何使用 PyQt5 检查按钮背景颜色。

if self.pushButton.setStyleSheet["background-color"] == "gray":

【问题讨论】:

This 应该适合你。 【参考方案1】:

您的代码不起作用,因为您在函数中使用了方括号(用于从列表或字典等对象中获取特定项目)。 此外,setStyleSheet() 用于设置样式表,而您可能想要检查 现有 样式表,该样式表与 styleSheet() 返回。

这将修复错误并使颜色开关正常工作:

        if self.pushButton.styleSheet() == "background-color: gray;":

无论如何我都不建议使用这种方法,因为只有当样式表 string 完全是这样时,它才会起作用。

很遗憾,无法通过样式表以编程方式获取属性设置。 使用setStyleSheet时,其内容由Qt内部解析处理,设置的属性从不暴露;您没有可以与之交互的“对象”,因此无法执行if "background-color" == "gray" 之类的操作。

这也意味着,如果您使用更复杂的 css,您将需要检查样式表的全部内容并再次完全设置它,因为 setStyleSheet 完全覆盖现有的。

如果您想坚持使用 css,您可以创建一个“模板”样式表(也允许您添加其他属性)并使用内部属性来跟踪颜色:

class Ui_MainWindow(object):
    buttonStyleSheet = """
        color: white;
        background-color: ;
    """
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(270, 200, 221, 71))
        self.pushButton.currentBackground = "gray"
        self.pushButton.setStyleSheet(self.buttonStyleSheet.format(self.pushButton.currentBackground))
        self.pushButton.setText("button")
        self.pushButton.setObjectName("pushButton")
        self.pushButton.clicked.connect(self.action)
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))

    def action(self):
        if self.pushButton.currentBackground == "gray":
            self.pushButton.currentBackground = "red"
            self.pushButton.setStyleSheet(self.buttonStyleSheet.format("red"))
        else:
            self.pushButton.currentBackground = "gray"
            self.pushButton.setStyleSheet(self.buttonStyleSheet.format("gray"))

PS:我强烈建议你不要编辑pyuic生成的python文件来创建你的程序;请阅读有关如何正确use the files created with Designer 的官方文档。

【讨论】:

以上是关于Pyqt5 检查按钮颜色并更改按钮颜色的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5 QPushButton setSyleSheet 按下时不改变按钮颜色

如何更改 CSS 中按钮的背景颜色?

如何更改按钮的边框颜色并更改editText中下划线的颜色?

单击按钮时更改按钮的背景颜色[重复]

单击按钮并更改另一个按钮的背景颜色

如何更改引导程序版本 4 按钮颜色