Найти - Пользователи
Полная версия: Перезаполнение модели, унаследованной от QAbstractItemModel
Начало » GUI » Перезаполнение модели, унаследованной от QAbstractItemModel
1
Gennady
Приветствую, сообщество!

Создал табличную модель, унаследованную от QAbstractTableModel. Модель заполняется с базы MongoDB, перегрузкой типичных методов: rowCount, data. Модели передается курсор базы данных, в методе data идет итерация по нему. Курсор, соответственно, содержит результаты выборки.

Задача подразумевает сложный поиск, поэтому выполнять фильтрацию через прокси модель никак, ее проще заполнить заново, передав новый курсор базы данных, тогда как фильтр для набора данных строится в приложении. Вопрос. Как корректно очистить модель полностью и побудить заново заполнить данные?

Если использовать метод reset(), получается глючная пижня (скриншот) , пробовал разные варианты, результат тот же. Все, что мне требуется: очистить модель полностью и заставить ее заполнить данные снова, с новым набором данных. Не создавать же новую модель, с новым вызовом setModel(…) из представления?

Спасибо
reclosedev
Так вроде работало:
class TableModel(QtCore.QAbstractTableModel):
    ...
    def set_source(self, source):
        self.beginResetModel()
        self._objects = source  # тут будет что-то свое
        self.endResetModel()
Не помню чтобы у модели был метод reset()
Gennady
Однако, набросал сейчас вариант для проверки (смотреть небольшой код теста на pastebin), результат тот же: скриншот результата.

PS/

Кстати, при изменении размеров окна выбрасывает ошибку прорисовки: "QPainter::begin: Paint device returned engine == 0, type: 0" (связано ли не знаю, это ошибка в данном коде, вчера не замечал).

К слову, почему-то ручное заполнение в цикле QStandardItemModel/QStandardItem происходит несколько быстрее, чем использовании наследника QAbstractItemModel. Такое могло бы быть, если бы обращался по индексу к курсору, но вроде бы с базой данных работа выполняется так же.

https://deptinfo-ensip.univ-poitiers.fr/ENS/pyside-docs/PySide/QtCore/QAbstractItemModel.html#PySide.QtCore.PySide.QtCore.QAbstractItemModel.reset — метод reset имеется.
reclosedev
__data__ вместо data - опечатка?

Не нашел где проверяется index.row().
Метод data() может быть вызван в любой момент и не один раз, в том числе и при изменении размеров или перекрытии окна.
Скорее всего из-за этого и остальные проблемы.

Для динамической подгрузки есть особые методы canFetchMore, fetchMore и еще что-то.
Gennady
Сорри, Ваша подсказка верна, вопрос получается закрыт. У меня в коде две грубые опечатки (я его набросал чисто для примера): во-первых, __data__, во-вторых, QtCore.Qt.QDisplayRole.

Хотя работает медленнее, чем с ручным заполнением QtStandardItemModel — при всех тысячах строк, в конкретном примере - без задержки вообще. Про canFetchMore буду смотреть.

Спасибо!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB