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