为了账号安全,请及时绑定邮箱和手机立即绑定

选中复选框时更改整个窗口的样式表

选中复选框时更改整个窗口的样式表

蓝山帝景 2023-08-03 16:24:31
所以我有这个 GUI,每当选中该复选框时我都会尝试更改它的样式表。这是我的代码的简化版本:from PyQt5 import QtCore, QtGui, QtWidgetsimport sysstyle_sheet = "#Form{background-color: rgb(255,255,255);}"inverted_ss = "#Form{background-color: rgb(0,0,0);}"class Ui_Form(object):    def setupUi(self, Form):        Form.setObjectName("Form")        Form.resize(698, 453)        Form.setStyleSheet(style_sheet)        #some design preferences here, including frame_19 and horizontalLayout_5 as seen below        self.checkBox = QtWidgets.QCheckBox(self.frame_19)        self.checkBox.setEnabled(True)        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)        sizePolicy.setHorizontalStretch(0)        sizePolicy.setVerticalStretch(0)        sizePolicy.setHeightForWidth(self.checkBox.sizePolicy().hasHeightForWidth())        self.checkBox.setSizePolicy(sizePolicy)        self.checkBox.setMinimumSize(QtCore.QSize(29, 25))        self.checkBox.setMaximumSize(QtCore.QSize(29, 50))        self.checkBox.setBaseSize(QtCore.QSize(25, 25))        self.checkBox.setLayoutDirection(QtCore.Qt.LeftToRight)        self.checkBox.setAutoFillBackground(False)        self.checkBox.setText("")        self.checkBox.setIconSize(QtCore.QSize(21, 21))        self.checkBox.setCheckable(True)        self.checkBox.stateChanged.connect(self.mode_change)        self.checkBox.setTristate(False)        self.checkBox.setObjectName("checkBox")        self.horizontalLayout_5.addWidget(self.checkBox)        #some more design preferences here        self.retranslateUi(Form)        QtCore.QMetaObject.connectSlotsByName(Form)    def retranslateUi(self, Form):        _translate = QtCore.QCoreApplication.translate        Form.setWindowTitle(_translate("Form", "App"))    def mode_change(self, state):        if state == QtCore.Qt.Checked:            Form.setStyleSheet(inverted)        else:            Form.setStyleSheet(style_sheet)问题是,它给了我一个警告:“未解析的引用:'Form'”。关于如何让它发挥作用有什么想法吗?
查看完整描述

1 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

在您的代码中,Form仅用作局部变量,用作setupUi和retranslateUi函数的参数。由于函数中没有这样的参数mode_change,因此 python 会崩溃,因为函数作用域中不存在该引用。


一种可能的解决方案是使用 lambda 进行连接,该 lambda 还将Form实例返回给方法:


        # ...

        self.checkBox.stateChanged.connect(lambda state: self.mode_change(Form, state))

        # ...


    def mode_change(self, Form, state):

        # ...

除此之外,您的代码还有一个更概念性的问题,那就是您正在尝试编辑使用pyuic(或尝试模仿其行为)生成的文件,这是永远不应该做的事情。要正确使用这些文件,您只需导入它们,并使用有关使用 Designer 的官方文档中建议的方法之一。


最常见和最简单的方法是多重继承方法,您可以从 widget 类和pyuic 类中创建子类。为了使用以下代码,请使用重新生成 python 文件pyuic并将其命名为ui_Form.py.


from PyQt5 import QtWidgets

from ui_Form import Ui_Form


style_sheet = "#Form{background-color: rgb(255,255,255);}"

inverted_ss = "#Form{background-color: rgb(0,0,0);}"


class MyForm(QtWidgets.QWidget, Ui_Form):

    def __init__(self, parent=None):

        super().__init__(parent)

        self.setupUi(self)


        self.checkBox.stateChanged.connect(self.mode_change)


    def mode_change(self, state):

        if state == QtCore.Qt.Checked:

            self.setStyleSheet(inverted)

        else:

            self.setStyleSheet(style_sheet)


if __name__ == "__main__":

    import sys

    app = QtWidgets.QApplication(sys.argv)

    myForm = MyForm()

    myForm.show()

    sys.exit(app.exec_())


查看完整回答
反对 回复 2023-08-03
  • 1 回答
  • 0 关注
  • 110 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信