Python PyQt4 functions to save and restore UI widget values?

前端 未结 7 832
悲哀的现实
悲哀的现实 2020-12-04 13:50

Before I attempt to write my own Python PyQt4 module functions... I wanted to ask if anyone has such a function to share.

In many of my python programs where I hav

7条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2020-12-04 14:37

    Here is another version of this great code, that includes QTabWidget, and wrap everything into a class for easier use:

    qt_utils.py:

    from PyQt5 import QtGui
    from PyQt5.QtWidgets import QComboBox, QCheckBox, QLineEdit,\
        QRadioButton, QSpinBox, QSlider, QListWidget, QTabWidget
    from PyQt5.QtCore import QSettings
    from distutils.util import strtobool
    
    import inspect
    
    
    class QMainWindow(QtGui.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(QMainWindow, 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 QComboBox, QLineEdit, QCheckBox, QRadioButton, QSpinBox, QSlider, QListWidget, QTabWidget
    
        @classmethod
        def _is_handled_type(cls, widget):
            return any(isinstance(widget, t) for t in cls._get_handled_types())
    
        def _gui_save(self):
            """
            save "ui" controls and values to registry "setting"
            :return:
            """
            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, QComboBox):
                    index = obj.currentIndex()  # get current index from combobox
                    value = obj.itemText(index)  # get the text for current index
    
                elif isinstance(obj, QTabWidget):
                    value = obj.currentIndex()
    
                elif isinstance(obj, QLineEdit):
                    value = obj.text()
    
                elif isinstance(obj, QCheckBox):
                    value = obj.isChecked()
    
                elif isinstance(obj, QRadioButton):
                    value = obj.isChecked()
    
                elif isinstance(obj, QSpinBox):
                    value = obj.value()
    
                elif isinstance(obj, QSlider):
                    value = obj.value()
    
                elif isinstance(obj, QListWidget):
                    self.settings.beginWriteArray(name)
                    for i in range(obj.count()):
                        self.settings.setArrayIndex(i)
                        self.settings.setValue(name_prefix + name, obj.item(i).text())
                    self.settings.endArray()
    
                if value is not None:
                    self.settings.setValue(name_prefix + name, value)
    
        def _gui_restore(self):
            """
            restore "ui" controls with values stored in registry "settings"
            :return:
            """
    
            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, QComboBox):
                    index = obj.findText(value)  # get the corresponding index for specified string in combobox
    
                    if index == -1:  # add to list if not found
                        obj.insertItems(0, [value])
                        index = obj.findText(value)
                        obj.setCurrentIndex(index)
                    else:
                        obj.setCurrentIndex(index)  # preselect a combobox value by index
    
                elif isinstance(obj, QTabWidget):
                    try:
                        value = int(value)
                    except ValueError:
                        value = 0
                    obj.setCurrentIndex(value)
    
                elif isinstance(obj, QLineEdit):
                    obj.setText(value)
    
                elif isinstance(obj, QCheckBox):
                    obj.setChecked(strtobool(value))
    
                elif isinstance(obj, QRadioButton):
                    obj.setChecked(strtobool(value))
    
                elif isinstance(obj, QSlider):
                    obj.setValue(int(value))
    
                elif isinstance(obj, QSpinBox):
                    obj.setValue(int(value))
    
                elif isinstance(obj, QListWidget):
                    size = self.settings.beginReadArray(name_prefix + name)
                    for i in range(size):
                        self.settings.setArrayIndex(i)
                        value = self.settings.value(name_prefix + name)
                        if value is not None:
                            obj.addItem(value)
                    self.settings.endArray()
    
        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)
    

    Here is an example of use:

    import qt_utils
    
    
    class MyMaine(qt_utils.QMainWindow, Ui_MainWindow):
        companie_name = 'Name'
        software_name = 'softName'
        _names_to_avoid = {'my_widget_name_not_to_save'}
    
        def __init__(self, parent=None):
            super(MyMaine, self).__init__(parent)
    
            self.setupUi(self)
    
            self._gui_restore()
    

提交回复
热议问题