Как в PyQt5/PyQt6 сохранить состояние spinBox с использованием QSettings?

Рейтинг: -1Ответов: 1Опубликовано: 03.08.2023

В данном коде реализовано сохранение состояния checkBox с использованием QSettings. Но, как в PyQt5(6) сохранить состояние spinBox? Помогите внести дополнение в код.

main.py

from PyQt6.QtWidgets import QApplication, QMainWindow, QWidget, QCheckBox, QGridLayout, QLabel, QSpacerItem, \
    QSizePolicy
from PyQt6.QtCore import QSize, QCoreApplication, QSettings
from PyQt6.uic import loadUi

ORGANIZATION_NAME = 'Example App'
ORGANIZATION_DOMAIN = 'example.com'
APPLICATION_NAME = 'QSettings program'
SETTINGS_TRAY = 'settings/tray'


class MainWindow(QMainWindow):
    # Переопределяем конструктор класса
    def __init__(self):
        super(MainWindow, self).__init__()

        loadUi("qsetting.ui", self)
        self.setWindowTitle("Settings Application")  # Устанавливаем заголовок окна

        # Обращаемся к настройкам программы
        settings = QSettings()
        # Забираем состояние чекбокса, с указанием типа данных:
        # type=bool является заменой метода toBool() в PyQt5
        check_state = settings.value(SETTINGS_TRAY, False, type=bool)
        # Устанавливаем состояние
        self.ui_ChBox.setChecked(check_state)
        # подключаем слот к сигналу клика по чекбоксу, чтобы сохранять его состояние в настройках
        self.ui_ChBox.clicked.connect(self.save_check_box_settings)

    # Слот для сохранения настроек чекбокса
    def save_check_box_settings(self):
        settings = QSettings()
        settings.setValue(SETTINGS_TRAY, self.ui_ChBox.isChecked())
        settings.sync()


if __name__ == "__main__":
    import sys

    # Для того, чтобы каждый раз при вызове QSettings не вводить данные вашего приложения
    # по которым будут находиться настройки, можно
    # установить их глобально для всего приложения
    QCoreApplication.setApplicationName(ORGANIZATION_NAME)
    QCoreApplication.setOrganizationDomain(ORGANIZATION_DOMAIN)
    QCoreApplication.setApplicationName(APPLICATION_NAME)

    app = QApplication(sys.argv)
    mw = MainWindow()
    mw.show()
    sys.exit(app.exec())

qsetting.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>467</width>
    <height>270</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QCheckBox" name="ui_ChBox">
    <property name="geometry">
     <rect>
      <x>230</x>
      <y>80</y>
      <width>81</width>
      <height>20</height>
     </rect>
    </property>
    <property name="text">
     <string>CheckBox</string>
    </property>
   </widget>
   <widget class="QSpinBox" name="spinBox">
    <property name="geometry">
     <rect>
      <x>120</x>
      <y>80</y>
      <width>42</width>
      <height>22</height>
     </rect>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>467</width>
     <height>26</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

Ответы

▲ 0

Данный код сохраняет состояние чекбокса и спинбокса, а также размер и положение окна на экране.

main.py

from PyQt6.QtWidgets import QApplication, QMainWindow
from PyQt6.QtCore import QCoreApplication, QSettings
from PyQt6.uic import loadUi

ORGANIZATION_NAME = 'Example App'
ORGANIZATION_DOMAIN = 'example.com'
APPLICATION_NAME = 'QSettings program'


class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        loadUi("qsetting.ui", self)
        self.setWindowTitle("Settings Application")
        self.settings = QSettings('My App', 'App1')
        print(self.settings.fileName())
        try:
            self.resize(self.settings.value('window size'))
            self.move(self.settings.value('window position'))
            self.check_state = self.settings.value('ui_checkBox', False, type=bool)
            self.spin_state = self.settings.value('ui_spinBox', 1)
        except:
            pass

        self.ui_ChBox.setChecked(self.check_state)
        self.ui_spinBox.setValue(self.spin_state)

    def closeEvent(self, event):
        self.settings.setValue('window size', self.size())
        self.settings.setValue('window position', self.pos())
        self.settings.setValue('ui_checkBox', self.ui_ChBox.isChecked())
        self.settings.setValue('ui_spinBox', self.ui_spinBox.value())
        self.settings.sync()


if __name__ == "__main__":
    import sys

    QCoreApplication.setApplicationName(ORGANIZATION_NAME)
    QCoreApplication.setOrganizationDomain(ORGANIZATION_DOMAIN)
    QCoreApplication.setApplicationName(APPLICATION_NAME)

    app = QApplication(sys.argv)
    mw = MainWindow()
    mw.show()
    sys.exit(app.exec())

qsetting.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>467</width>
    <height>270</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QCheckBox" name="ui_ChBox">
    <property name="geometry">
     <rect>
      <x>230</x>
      <y>80</y>
      <width>81</width>
      <height>20</height>
     </rect>
    </property>
    <property name="text">
     <string>CheckBox</string>
    </property>
   </widget>
   <widget class="QSpinBox" name="ui_spinBox">
    <property name="geometry">
     <rect>
      <x>120</x>
      <y>80</y>
      <width>42</width>
      <height>22</height>
     </rect>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>467</width>
     <height>26</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>