Evgenii Legotckoi
15 січня 2017 р. 17:49

PyQt5 - Урок 004. Використання QSettings

Зміст

Ознайомимося з використанням QSettings у PyQt5. Для цього пропоную написати невелику програму, в якій буде один єдиний чекбокс, стан якого ми зберігатимемо в налаштуваннях. Стан чекбокса зберігатиметься на кліку на даний чекбокс. Після закриття програми і повторного відкриття чекбокс буде виставлений з тим станом, в якому він був при закритті програми.


main .py

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


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


class MainWindow(QMainWindow):
    """
        Объявление чекбокса.
        Инициализироваться будет в конструкторе.
    """
    check_box = None

    # Переопределяем конструктор класса
    def __init__(self):
        # Обязательно нужно вызвать метод супер класса
        QMainWindow.__init__(self)

        self.setMinimumSize(QSize(480, 240))  # Устанавливаем размеры
        self.setWindowTitle("Settings Application")  # Устанавливаем заголовок окна
        central_widget = QWidget(self)  # Создаём центральный виджет
        self.setCentralWidget(central_widget)  # Устанавливаем центральный виджет

        grid_layout = QGridLayout()  # Создаём QGridLayout
        central_widget.setLayout(grid_layout)  # Устанавливаем данное размещение в центральный виджет
        grid_layout.addWidget(QLabel("Application, which can minimize to Tray", self), 0, 0)

        # Добавляем чекбокс, состояние которого будет сохраняться в настройках
        self.check_box = QCheckBox('Settings CheckBox for minimizing to tray')
        grid_layout.addWidget(self.check_box, 1, 0)
        grid_layout.addItem(QSpacerItem(0, 0, QSizePolicy.Expanding, QSizePolicy.Expanding), 2, 0)

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

    # Слот для сохранения настроек чекбокса
    def save_check_box_settings(self):
        settings = QSettings()
        settings.setValue(SETTINGS_TRAY, self.check_box.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())

Вам це подобається? Поділіться в соціальних мережах!

ЖН
  • 08 грудня 2018 р. 19:02

а как можно это сделать без чек бокса

Вы можете в QSettings записать откуда угодно bool переменную без всяких чекбоксов.

def save_check_box_settings(self):
        settings = QSettings()
        settings.setValue(SETTINGS_TRAY, some_variable)
        settings.sync()

Обратите внимание на some_variable . Это переменная в которой может быть какая угодно переменная.

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up