Ошибка возникает из-за попытки сериализовать объект 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`.