Каким образом можно сохранить элементы QListWidget?

  • 18 августа 2023 г. 14:06
Ответы на вопрос 5
Ошибка возникает из-за попытки сериализовать объект QListWidgetItem с помощью pickle. Однако вы можете сохранить только значения элементов QListWidget, а не сами элементы.

Вам нужно сохранять только текст элементов QListWidgetItem, а не сами объекты QListWidgetItem. Вот исправленный код:

```python
class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        uic.loadUi('gui.ui', self)

    def _get_saving_types(self) -> list:
        return [
            (QLineEdit, ["setText", "text"]),
            (QCheckBox, ["setChecked", "isChecked"]),
            (QListWidget, ["addItems"]),
        ]

    def loadState(self):
        settings = QSettings('gui.ini', QSettings.Format.IniFormat)
        for type, method in self._get_saving_types():
            for widget in self.findChildren(type):
                if settings.value(widget.objectName()) is not None:
                    methodcaller(method[0], settings.value(widget.objectName()))(widget)

    def saveState(self):
        settings = QSettings('gui.ini', QSettings.Format.IniFormat)
        for type, method in self._get_saving_types():
            for widget in self.findChildren(type):
                if isinstance(widget, QListWidget):
                    items = []
                    for index in range(widget.count()):
                        items.append(widget.item(index).text())  # сохраняем только текст элемента QListWidgetItem
                    settings.setValue(widget.objectName(), items)
                else:
                    settings.setValue(widget.objectName(), methodcaller(method[1])(widget))
```

Теперь элементы QListWidgetItem в QListWidget сохраняются только как текст.
Попробуй так:
```
def saveState(self):
        settings = QSettings('gui.ini', QSettings.Format.IniFormat)
        for type, method in self._get_saving_types():
            for widget in self.findChildren(type):
                if isinstance(widget, QListWidget):
                    items = []
                    for index in range(widget.count()):
                        items.append(widget.item(index).text())
                    settings.setValue(widget.objectName(), items)
                else:
                    settings.setValue(widget.objectName(), methodcaller(method[1])(widget))

def loadState(self):
        settings = QSettings('gui.ini', QSettings.Format.IniFormat)
        for type, method in self._get_saving_types():
            for widget in self.findChildren(type):
                if settings.contains(widget.objectName()):
                    if isinstance(widget, QListWidget):
                        items = settings.value(widget.objectName(), [])
                        widget.clear()
                        widget.addItems(items)
                    else:
                        methodcaller(method[0], settings.value(widget.objectName()))(widget)
```

Если не ошибаюсь, то QListWidgetItem не является сериализуемым с помощью pickle, поэтому возникает ошибка. Для сохранения значений QListWidget нужно сохранять не сами объекты QListWidgetItem, а данные, которые они представляют. В данном случае вы можете сохранить текстовое представление каждого элемента в QListWidget.
def saveState(self):
        settings = QSettings('gui.ini', QSettings.Format.IniFormat)
        for type, method in self._get_saving_types():
            for widget in self.findChildren(type):
                if isinstance(widget, QListWidget):
                    items = []
                    for index in range(widget.count()):
                        items.append(widget.item(index).text())  # Сохраняем текст элемента
                    settings.setValue(widget.objectName(), items)
                else:
                    settings.setValue(widget.objectName(), methodcaller(method[1])(widget))
def loadState(self):
        settings = QSettings('gui.ini', QSettings.Format.IniFormat)
        for type, method in self._get_saving_types():
            for widget in self.findChildren(type):
                if settings.contains(widget.objectName()):
                    if isinstance(widget, QListWidget):
                        items = settings.value(widget.objectName(), [])
                        widget.clear()
                        widget.addItems(items)
                    else:
                        methodcaller(method[0], settings.value(widget.objectName()))(widget)
`QListWidgetItem` не может быть сериализован с помощью `pickle`, поэтому возникает ошибка. Чтобы сохранить значения `QListWidget`, вам нужно сохранить не сами объекты `QListWidgetItem`, а данные, которые они представляют. В данном случае вы можете сохранить текстовое представление каждого элемента в `QListWidget`.
Похожие вопросы