关闭窗口时不要保留复选框

2024-09-28 13:28:40 发布

您现在位置:Python中文网/ 问答频道 /正文

当我在示例中单击“打开”时,打开windowncheck窗口,在窗口windowncheck中我选中复选框_5和复选框_6,然后按close,当我重新打开windowncheck时,复选框_5和复选框_6不再可用。如何使复选框_5和复选框_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_())

enter image description here

enter image description here


Tags: selfcloseinitdefbuttongrid复选框checkbox
1条回答
网友
1楼 · 发布于 2024-09-28 13:28:40

程序在运行时将其状态信息加载到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_())

相关问题 更多 >

    热门问题