Как сохранить данные, введенные в несколько полей формы в QT?

Как можно оптимизировать процесс сохранения и загрузки данных из виджетов формы в PyQt, чтобы избежать описания каждого поля вручную и обеспечить удобство добавления новых полей в будущем?
  • 29 февраля 2024 г. 4:28
Ответы на вопрос 2
Для сохранения данных, введенных в несколько полей формы в PyQt, рекомендуется использовать классы моделей данных, такие как QSettings или SQLite базы данных. 

Для оптимизации процесса сохранения и загрузки данных из виджетов формы, можно использовать методы, например, в цикле проходить по всем виджетам и сохранять/загружать значения из них. Другой способ - использовать словарь, где ключом будет имя виджета, а значением - его значение. Такой подход позволит легко добавлять и управлять новыми полями в форме. 

Пример:

```python
class Form(QWidget):
    def __init__(self):
        super().__init__()
        
        self.widgets = {
            'field1': QLineEdit(),
            'field2': QComboBox(),
            'field3': QRadioButton()
        }
        
        layout = QVBoxLayout()
        
        for name, widget in self.widgets.items():
            layout.addWidget(widget)
        
        self.setLayout(layout)
    
    def save_data(self):
        data = {}
        for name, widget in self.widgets.items():
            if isinstance(widget, QLineEdit):
                data[name] = widget.text()
            elif isinstance(widget, QComboBox):
                data[name] = widget.currentText()
            elif isinstance(widget, QRadioButton):
                data[name] = widget.isChecked()
        
        # сохранение данных
        
    def load_data(self):
        data = {} # загрузка данных
        
        for name, value in data.items():
            widget = self.widgets[name]
            if isinstance(widget, QLineEdit):
                widget.setText(value)
            elif isinstance(widget, QComboBox):
                index = widget.findText(value)
                widget.setCurrentIndex(index)
            elif isinstance(widget, QRadioButton):
                widget.setChecked(value)
```

Таким образом, при добавлении новых полей в форму, нужно просто добавить их в словарь `self.widgets` и соответствующие условия в методы `save_data` и `load_data`.
Сразу оговорюсь, что я не изучал вопрос и не знаю, есть ли нормальное решение. Но в голову пришла такая мысль: 

У элементов формы есть ObjectName. По умолчанию это что-то типа groupBox_2, comboBox_5 и тд.
Выполнив form.__dict__ ты увидишь все атрибуты формы.


# Опишем нужные нам поля следующим образом:
attr_types = {
    "comboBox": ["currentText", "setCurrentText"],
    "lineEdit": ["text", "setText"],
    "plainTextEdit": ["toPlainText", "setPlainText"],
}

# Выберем нужные элементы из атрибутов формы:
for unit in [x for x in form.__dict__ if x.startswith(tuple(attr_types))]:
    # И получим их значения
    value = getattr(getattr(form, unit), attr_types.get(unit.split('_')[0])[0])()


Теперь у тебя есть:
unit - имя твоего элемента
value - его значение

Сохраняй куда угодно
Похожие вопросы