Как сохранить QListWidgetItems?

Пишу приложение, хочу сохранять значения виджетов (в идеале бы найти какую-нибудь функцию, которая это все делает, но видимо таких нет), пишу костыль чтобы сохранять значения, но на моменте сохранения элементов QListWidget, вылезает ошибка:
TypeError: cannot pickle 'QListWidgetItem' object
Код:
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)
        pass
    
    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))
                    settings.setValue(widget.objectName(), items) # Тут возникает ошибка
                    pass
                else:
                    settings.setValue(widget.objectName(), methodcaller(method[1])(widget))
  • Вопрос задан
  • 97 просмотров
Решения вопроса 1
vndrussia
@vndrussia
Вроде разработчик,а вроде и нет
Попробуй так:
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.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы