Python 使用Qsettings恢复QCheckBox

Python 使用Qsettings恢复QCheckBox,python,python-3.x,pyqt5,qsettings,qcheckbox,Python,Python 3.x,Pyqt5,Qsettings,Qcheckbox,关闭文件后,QCheckBox希望保存和恢复checkstate 尝试了以下操作,但它并没有真正起作用 代码: import sys from PyQt5 import QtCore, QtGui, QtWidgets class SecondOrder(QtWidgets.QWidget): def __init__(self, parent=None): super(SecondOrder, self).__init__(parent) self.s

关闭文件后,
QCheckBox
希望保存和恢复
checkstate

尝试了以下操作,但它并没有真正起作用

代码:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets

class SecondOrder(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(SecondOrder, self).__init__(parent)
        self.setFont(QtGui.QFont("Helvetica", 8, QtGui.QFont.Normal, italic=False))

        curvaturelabel = QtWidgets.QLabel('Nominal curvature')
        stiffnesslabel = QtWidgets.QLabel('Nominal stiffness')
        simcurvaturelabel = QtWidgets.QLabel('Simplified nominal curvature')   

        self.curvaturecheck = QtWidgets.QCheckBox()
        self.stiffnesscheck = QtWidgets.QCheckBox()
        self.simcurvaturecheck = QtWidgets.QCheckBox()

        self.clay = QtWidgets.QVBoxLayout()
        self.clay.addWidget(curvaturelabel)
        self.clay.addWidget(stiffnesslabel)
        self.clay.addWidget(simcurvaturelabel)

        self.dlay = QtWidgets.QVBoxLayout()
        self.dlay.addWidget(self.curvaturecheck)
        self.dlay.addWidget(self.stiffnesscheck)
        self.dlay.addWidget(self.simcurvaturecheck)

        grid = QtWidgets.QGridLayout(self)
        grid.addLayout(self.dlay, 0, 0)
        grid.addLayout(self.clay, 0, 1)

        Secondorder_Group = QtWidgets.QGroupBox(self)
        Secondorder_Group.setTitle("&Second order analysis method")
        Secondorder_Group.setLayout(grid)

        self.elay = QtWidgets.QHBoxLayout(self)
        self.elay.addWidget(Secondorder_Group)     
        self.elay.setSizeConstraint(self.elay.SetFixedSize)

        group = QtWidgets.QButtonGroup(self) 
        group.addButton(self.curvaturecheck) 
        group.addButton(self.stiffnesscheck) 
        group.addButton(self.simcurvaturecheck)

        self.readSettings()

        self.curvaturecheck.stateChanged.connect(lambda: self.writeSettings())
        self.stiffnesscheck.stateChanged.connect(lambda: self.writeSettings())
        self.simcurvaturecheck.stateChanged.connect(lambda: self.writeSettings())

    def readSettings(self):
        settings = QtCore.QSettings('file.ini')
        settings.beginGroup("QCheckBox")
        self.curvaturecheck.setCheckState(settings.value("A", QtCore.Qt.Checked, bool))
        self.stiffnesscheck.setCheckState(settings.value("B", False, bool))
        self.simcurvaturecheck.setCheckState(settings.value("C", False, bool))
        settings.endGroup()

    def writeSettings(self):
        settings = QtCore.QSettings('file.ini')
        settings.beginGroup("QCheckBox")
        settings.setValue("A", self.curvaturecheck.isCheckable())
        settings.setValue("B", self.stiffnesscheck.isCheckable())
        settings.setValue("C", self.simcurvaturecheck.isCheckable())
        settings.endGroup()


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = SecondOrder()
    w.show()
    sys.exit(app.exec_())
请注意,尝试了以下代码,它确实进行了保存和恢复,但它混合了多个检查?希望能够检查一次并恢复

    settings.setValue("A", self.curvaturecheck.isChecked())
    settings.setValue("B", self.stiffnesscheck.isChecked())
    settings.setValue("C", self.simcurvaturecheck.isChecked())

QButtonGroup提供了一个抽象容器,可以将按钮小部件放入其中。。它不提供此容器的可视化表示(请参见QGroupBox中的容器小部件),而是管理组中每个按钮的状态

setValue()
在每个复选框上都可以切换另一个复选框

但真正的问题是
isCheckable()
(方法可以检查也可以不检查)。可能需要使用
isChecked()
(值设置为true)

编辑。您可以尝试通过
setChecked()
设置状态

或者,如果您想支持部分选中,请使用
setCheckState()
(如您所用)和
checkState()
来获取信息。

QButtonGroup提供了一个抽象容器,可以将按钮小部件放入其中。。它不提供此容器的可视化表示(请参见QGroupBox中的容器小部件),而是管理组中每个按钮的状态

setValue()
在每个复选框上都可以切换另一个复选框

但真正的问题是
isCheckable()
(方法可以检查也可以不检查)。可能需要使用
isChecked()
(值设置为true)

编辑。您可以尝试通过
setChecked()
设置状态


或者,如果要支持部分选中,请使用
setCheckState()
(如您所用)和
checkState()
来获取信息。

如果要保存类型T数据,则必须使用使用类型T的函数,在您的情况下,使用isChecked()保存布尔值,并使用函数setCheckState()使用导致错误的Qt::CheckState类型的

考虑到上述情况,有两种解决方案:

  • 使用bool:
def读取设置(自身):
设置=QtCore.QSettings(“file.ini”)
settings.beginGroup(“QCheckBox”)
self.curvaturecheck.setChecked(settings.value(“A”、True、bool))
self.stiffnesscheck.setChecked(settings.value(“B”,False,bool))
self.simcurvaturecheck.setChecked(settings.value(“C”,False,bool))
settings.endGroup()
def写入设置(自):
设置=QtCore.QSettings(“file.ini”)
settings.beginGroup(“QCheckBox”)
settings.setValue(“A”,self.curvaturecheck.isChecked())
settings.setValue(“B”,self.stiffnesscheck.isChecked())
settings.setValue(“C”,self.simcurvaturecheck.isChecked())
settings.endGroup()
  • 使用Qt::CheckState
建议您删除
settings.fileName()
中的.ini文件

另一方面,无需使用lambda函数,请将代码更改为:

self.curvaturecheck.stateChanged.connect(self.writeSettings)
self.stiffnesscheck.stateChanged.connect(self.writeSettings)
self.simcurvaturecheck.stateChanged.connect(self.writeSettings)

如果要保存类型T数据,则必须使用使用类型T的函数,在本例中,使用isChecked()保存布尔值,并且要使用使用导致错误的Qt::CheckState类型的函数setCheckState()

考虑到上述情况,有两种解决方案:

  • 使用bool:
def读取设置(自身):
设置=QtCore.QSettings(“file.ini”)
settings.beginGroup(“QCheckBox”)
self.curvaturecheck.setChecked(settings.value(“A”、True、bool))
self.stiffnesscheck.setChecked(settings.value(“B”,False,bool))
self.simcurvaturecheck.setChecked(settings.value(“C”,False,bool))
settings.endGroup()
def写入设置(自):
设置=QtCore.QSettings(“file.ini”)
settings.beginGroup(“QCheckBox”)
settings.setValue(“A”,self.curvaturecheck.isChecked())
settings.setValue(“B”,self.stiffnesscheck.isChecked())
settings.setValue(“C”,self.simcurvaturecheck.isChecked())
settings.endGroup()
  • 使用Qt::CheckState
建议您删除
settings.fileName()
中的.ini文件

另一方面,无需使用lambda函数,请将代码更改为:

self.curvaturecheck.stateChanged.connect(self.writeSettings)
self.stiffnesscheck.stateChanged.connect(self.writeSettings)
self.simcurvaturecheck.stateChanged.connect(self.writeSettings)

非常感谢,就像您的双重解决方案一样,两者都很好:)非常感谢,就像您的双重解决方案一样,两者都很好:)
def readSettings(self):
    settings = QtCore.QSettings("file.ini")
    settings.beginGroup("QCheckBox")
    self.curvaturecheck.setCheckState(
        settings.value("A", QtCore.Qt.Checked, QtCore.Qt.CheckState)
    )
    self.stiffnesscheck.setCheckState(
        settings.value("B", QtCore.Qt.Unchecked, QtCore.Qt.CheckState)
    )
    self.simcurvaturecheck.setCheckState(
        settings.value("C", QtCore.Qt.Unchecked, QtCore.Qt.CheckState)
    )
    settings.endGroup()

def writeSettings(self):
    settings = QtCore.QSettings("file.ini")
    settings.beginGroup("QCheckBox")
    settings.setValue("A", self.curvaturecheck.checkState())
    settings.setValue("B", self.stiffnesscheck.checkState())
    settings.setValue("C", self.simcurvaturecheck.checkState())
    settings.endGroup()