【问题标题】:Restoring QCheckBox with Qsettings使用 Qsettings 恢复 QCheckBox
【发布时间】:2020-03-13 05:32:06
【问题描述】:

拥有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())

【问题讨论】:

    标签: python python-3.x pyqt5 qsettings qcheckbox


    【解决方案1】:

    https://doc.qt.io/qt-5/qbuttongroup.html#details

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

    每个复选框上的setValue() 可以切换另一个。

    但真正的问题是isCheckable()(表示可以检查或不检查)。可能您想使用isChecked()(值设置为true)。

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

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

    【讨论】:

      【解决方案2】:

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

      考虑到以上有2个解决方案:

      • 使用布尔:
      def readSettings(self):
          settings = 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 writeSettings(self):
          settings = 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
      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()
      

      建议您删除位于settings.fileName() 的.ini 文件。

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

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

      【讨论】:

      • 非常感谢,喜欢您的双重解决方案,两者都运作良好:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-10
      • 1970-01-01
      • 2013-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多