Форум сайта python.su
Приветствую, сообщество!
Создал табличную модель, унаследованную от QAbstractTableModel. Модель заполняется с базы MongoDB, перегрузкой типичных методов: rowCount, data. Модели передается курсор базы данных, в методе data идет итерация по нему. Курсор, соответственно, содержит результаты выборки.
Задача подразумевает сложный поиск, поэтому выполнять фильтрацию через прокси модель никак, ее проще заполнить заново, передав новый курсор базы данных, тогда как фильтр для набора данных строится в приложении. Вопрос. Как корректно очистить модель полностью и побудить заново заполнить данные?
Если использовать метод reset(), получается глючная пижня (скриншот) , пробовал разные варианты, результат тот же. Все, что мне требуется: очистить модель полностью и заставить ее заполнить данные снова, с новым набором данных. Не создавать же новую модель, с новым вызовом setModel(…) из представления?
Спасибо
Офлайн
Так вроде работало:
class TableModel(QtCore.QAbstractTableModel): ... def set_source(self, source): self.beginResetModel() self._objects = source # тут будет что-то свое self.endResetModel()
Офлайн
Однако, набросал сейчас вариант для проверки (смотреть небольшой код теста на 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 имеется.
Офлайн
__data__ вместо data - опечатка?
Не нашел где проверяется index.row().
Метод data() может быть вызван в любой момент и не один раз, в том числе и при изменении размеров или перекрытии окна.
Скорее всего из-за этого и остальные проблемы.
Для динамической подгрузки есть особые методы canFetchMore, fetchMore и еще что-то.
Офлайн
Сорри, Ваша подсказка верна, вопрос получается закрыт. У меня в коде две грубые опечатки (я его набросал чисто для примера): во-первых, __data__, во-вторых, QtCore.Qt.QDisplayRole.
Хотя работает медленнее, чем с ручным заполнением QtStandardItemModel — при всех тысячах строк, в конкретном примере - без задержки вообще. Про canFetchMore буду смотреть.
Спасибо!
Отредактировано Gennady (Сен. 20, 2013 22:39:06)
Офлайн