【问题标题】:do not keep the checkbox when close window关闭窗口时不要保留复选框
【发布时间】:2021-05-23 07:52:01
【问题描述】:

当我在示例中单击打开时,打开 windowncheck 窗口,在窗口 windowncheck 中我检查到 checkbox_5 和 checkbox_6 然后我按下关闭,当我重新打开 windowncheck 时,checkbox_5 和 checkbox_6 不再可用。如何使 checkbox_5 和 checkbox_6 不丢失。

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

class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        qbtn = QPushButton('Quit', self)
        qbtn.clicked.connect(QApplication.instance().quit)
        qbtn.resize(50,50)
        qbtn.move(50, 50)
        qbtn.setStyleSheet("color:red")
        qbtn.setStyleSheet("background-color:green")

        newwindow_button = QPushButton('open', self)
        newwindow_button.clicked.connect(self.windown)
        newwindow_button.resize(50,50)
        newwindow_button.move(150, 50)
        self.setGeometry(300, 300, 350, 250)
        self.setWindowTitle('Check state')
        self.show()

    def windown(self):
        self.ff = Windowcheck()
          
class Windowcheck(QWidget):
    def __init__(self, parent=None):
        super(Windowcheck, self).__init__(parent)
        self.listCheckBox = ["Checkbox_1", "Checkbox_2", "Checkbox_3", "Checkbox_4", "Checkbox_5",
                             "Checkbox_6", "Checkbox_7", "Checkbox_8", "Checkbox_9", "Checkbox_10" ]
        self.listLabel    = ['', '', '', '', '', '', '', '', '', '', ] 
        grid = QGridLayout()
        for i, v in enumerate(self.listCheckBox):
            self.listCheckBox[i] = QCheckBox(v)
            self.listLabel[i] = QLabel()
            grid.addWidget(self.listCheckBox[i], i, 0)
            grid.addWidget(self.listLabel[i],    i, 1)

        self.button = QPushButton("CheckBox")
        self.button.clicked.connect(self.checkboxChanged)
        self.button_close = QPushButton("close")
        self.button_close.clicked.connect(self.close)
        self.labelResult = QLabel()

        grid.addWidget(self.button,      10, 0, 1,2)  
        grid.addWidget(self.button_close,11, 0, 1,2)    
        grid.addWidget(self.labelResult, 12, 0, 1,2)  
        self.setLayout(grid)    
        self.show()

    def checkboxChanged(self):
        self.labelResult.setText("")
        for i, v in enumerate(self.listCheckBox):
            self.listLabel[i].setText("True" if v.checkState() else "False")
            self.labelResult.setText("{}, {}".format(self.labelResult.text(),
                                                     self.listLabel[i].text()))  


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

【问题讨论】:

    标签: python pyqt pyqt5 qcheckbox


    【解决方案1】:

    程序在运行时将其状态信息加载到 RAM 中,关闭应用程序后它会丢失,这就是信息不持久的原因。如果您希望应用程序在关闭之前保存状态,那么您必须通过文件将该信息存储在硬盘驱动器上。例如,在 Qt 中,您可以使用 QSettings 来完成这项工作:

    import sys
    from PyQt5.QtCore import *
    from PyQt5.QtWidgets import *
    
    
    class Example(QWidget):
        def __init__(self):
            super().__init__()
            self.initUI()
    
        def initUI(self):
            self.settings = QSettings()
    
            self.ff = Windowcheck()
    
            qbtn = QPushButton("Quit", self)
            qbtn.clicked.connect(QApplication.instance().quit)
            qbtn.setGeometry(50, 50, 50, 50)
            qbtn.setStyleSheet("color:red; background-color:green")
    
            newwindow_button = QPushButton("open", self)
            newwindow_button.clicked.connect(self.ff.show)
            newwindow_button.setGeometry(150, 50, 50, 50)
            self.setGeometry(300, 300, 350, 250)
            self.setWindowTitle("Check state")
    
            self.readSettings()
    
        def readSettings(self):
            for i in self.settings.value("indexes", [], type=list):
                self.ff.listCheckBox[int(i)].setChecked(True)
    
        def saveSettings(self):
            indexes = self.ff.indexes
            self.settings.setValue("indexes", indexes)
    
        def closeEvent(self, event):
            super().closeEvent(event)
            self.saveSettings()
    
    
    class Windowcheck(QWidget):
        def __init__(self, parent=None):
            super(Windowcheck, self).__init__(parent)
            texts = [
                "Checkbox_1",
                "Checkbox_2",
                "Checkbox_3",
                "Checkbox_4",
                "Checkbox_5",
                "Checkbox_6",
                "Checkbox_7",
                "Checkbox_8",
                "Checkbox_9",
                "Checkbox_10",
            ]
            self.listCheckBox = []
            self.listLabel = []
    
            grid = QGridLayout(self)
    
            for i, text in enumerate(texts):
                checkbox = QCheckBox(text)
                label = QLabel()
                grid.addWidget(checkbox, i, 0)
                grid.addWidget(label, i, 1)
                self.listCheckBox.append(checkbox)
                self.listLabel.append(label)
    
            self.button = QPushButton("CheckBox")
            self.button.clicked.connect(self.checkboxChanged)
            self.button_close = QPushButton("close")
            self.button_close.clicked.connect(self.close)
            self.labelResult = QLabel()
    
            grid.addWidget(self.button, 10, 0, 1, 2)
            grid.addWidget(self.button_close, 11, 0, 1, 2)
            grid.addWidget(self.labelResult, 12, 0, 1, 2)
    
        @property
        def indexes(self):
            return [
                i for i, checkbox in enumerate(self.listCheckBox) if checkbox.isChecked()
            ]
    
        def checkboxChanged(self):
            self.labelResult.clear()
            texts = []
            for label, checkbox in zip(self.listLabel, self.listCheckBox):
                text = "True" if checkbox.isChecked() else "False"
                label.setText(text)
                texts.append(text)
            self.labelResult.setText(", ".join(texts))
    
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        ex = Example()
        ex.show()
        sys.exit(app.exec_())
    

    【讨论】:

    • @nghiep 如果回答对您有帮助,请不要忘记标记为正确,如果您不知道该怎么做,请查看stackoverflow.com/tour
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-03
    • 2011-03-03
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多