如何解决选中复选框时更改整个窗口的样式表
所以我有这样的GUI,我想只要复选框被选中,以改变它的样式表。这是我的代码的简化版本:
from PyQt5 import QtCore,QtGui,QtWidgets
import sys
style_sheet = "#Form{background-color: rgb(255,255,255);}"
inverted_ss = "#Form{background-color: rgb(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)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
ui = Ui_Form()
ui.setupUi(Form)
Form.show()
sys.exit(app.exec_())
问题是,它给了我一个警告:“未解决的引用:'表单'”。关于如何使它起作用的任何想法吗?
解决方法
在您的代码中,Form
仅用作 local 变量,用作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
生成的文件(或试图模仿其行为),是永远不应该做的事情。要正确使用这些文件,只需导入,并使用官方文档中关于using Designer的建议方法之一。
最常见,最简单的方法是多重继承方法,您可以从小部件类和pemic类中继承该方法。为了使用以下代码,请使用pyuic
重新生成python文件,并将其命名为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);}"
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_())
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。