Как сохранять настройки всех виджетов

Допустим есть на форме (GUI) виджеты: spinBox, radiobuton_1/radiobuton_2, checkbox_1/checkbox_2.

Как возможно проще сохранять состояние этих виджетов : какой выбран rediobutton или checkbox, и значение в spinBox, которое было на момент закрытия программы.


Ответы (1 шт):

Автор решения: S. Nick

Как вариант, попробуйте.

from PyQt5.Qt import *
from distutils.util import strtobool
import inspect


class MyQMainWindow(QMainWindow):
    companie_name = 'CompanieName'
    software_name = 'SoftwareName'
    settings_ui_name = 'defaultUiwidget'
    settings_ui_user_name = 'user'
    _names_to_avoid = {}

    def __init__(self, parent=None):
        super(MyQMainWindow, self).__init__(parent)
        self.settings = QSettings(self.companie_name, self.software_name)

    def closeEvent(self, e):
        self._gui_save()

    @classmethod
    def _get_handled_types(cls):
        return QSpinBox, QCheckBox, QRadioButton

    @classmethod
    def _is_handled_type(cls, widget):
        return any(isinstance(widget, t) for t in cls._get_handled_types())

    def _gui_save(self):
        """ сохранить элементы управления и значения в настройках реестра """
        name_prefix = f"{self.settings_ui_name}/"
        self.settings.setValue(name_prefix + "geometry", self.saveGeometry())

        for name, obj in inspect.getmembers(self):
            if not self._is_handled_type(obj):
                continue

            name = obj.objectName()
            value = None
            
            if isinstance(obj, QCheckBox):
                value = obj.isChecked()
            elif isinstance(obj, QRadioButton):
                value = obj.isChecked()
            elif isinstance(obj, QSpinBox):
                value = obj.value()

            if value is not None:
                self.settings.setValue(name_prefix + name, value)

    def _gui_restore(self):
        """ восстановить элементы управления со значениями, 
        хранящимися в настройках реестра
        """
        name_prefix = f"{self.settings_ui_name}/"
        geometry_value = self.settings.value(name_prefix + "geometry")
        if geometry_value:
            self.restoreGeometry(geometry_value)

        for name, obj in inspect.getmembers(self):
            if not self._is_handled_type(obj):
                continue
            if name in self._names_to_avoid:
                continue

            name = obj.objectName()
            value = None
            if not isinstance(obj, QListWidget):
                value = self.settings.value(name_prefix + name)
                if value is None:
                    continue

            if isinstance(obj, QCheckBox):
                obj.setChecked(strtobool(value))
            elif isinstance(obj, QRadioButton):
                obj.setChecked(strtobool(value))
            elif isinstance(obj, QSpinBox):
                obj.setValue(int(value))

    def _add_setting(self, name, value):
        name_prefix = f"{self.settings_ui_user_name}/"
        self.settings.setValue(name_prefix + name, value)

    def _get_setting(self, name):
        name_prefix = f"{self.settings_ui_user_name}/"
        return self.settings.value(name_prefix + name)
        

class MainWindow(MyQMainWindow):
    companie_name = 'Name'
    software_name = 'softName'
    _names_to_avoid = {'my_widget_name_not_to_save'}

    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setWindowTitle(' ')
        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)
        
        self.rb_1 = QRadioButton('RB 1')
        self.rb_1.setObjectName('rb_1')
        self.rb_2 = QRadioButton('RB 2')
        self.rb_2.setObjectName('rb_2')        

        self.cb_1 = QCheckBox('Показать заголовок.')
        self.cb_1.setObjectName('cb_1')
        self.cb_1.stateChanged.connect(self.changeTitle)
        self.cb_2 = QCheckBox('CB 2')
        self.cb_2.setObjectName('cb_2')
        
        self.label = QLabel()
        self.spinBox = QSpinBox()        
        self.spinBox.setObjectName("spinBox")
        self.spinBox.valueChanged.connect(self.label.setNum)
       
        self.gridLayout = QGridLayout(self.centralWidget)
        self.gridLayout.addWidget(self.rb_1, 0, 0)
        self.gridLayout.addWidget(self.rb_2, 0, 1)
        self.gridLayout.addWidget(self.cb_1, 1, 0)
        self.gridLayout.addWidget(self.cb_2, 1, 1)
        self.gridLayout.addWidget(self.label, 2, 0) 
        self.gridLayout.addWidget(self.spinBox, 2, 1)
        
        self._gui_restore()
        
    def changeTitle(self, state):
        if state == Qt.Checked:
            self.setWindowTitle('Hello QCheckBox')
        else:
            self.setWindowTitle(' ')

        
if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    w = MainWindow()
    w.show()
    w.resize(300, 200)
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка