亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

選中復選框時更改整個窗口的樣式表

選中復選框時更改整個窗口的樣式表

藍山帝景 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 關注
  • 160 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號