Форум сайта python.su
Всем привет!
Столкнулся с небольшой проблемой динамической подгрузки данных. Заполняю модель из базы данных, перегружая методы columnCount, rowCount и data. Представление запрашивает поначалу первые 3-4 десятка строк, зависимо от размера окна. При попытке прокрутки строк, изменения размеров окна — получаются тормоза и рывки, до подвисаний. Понятное дело, метод data дергается и при шевелении мышкой, с Qt.DisplayRole. Хорошо бы обойти строки “раз и навсегда”.
Получается, перегрузка данных методов не является достаточной. Может есть смысл выгружать все данные из базы данных и вручную заполнять все строки (insertRow или как-то еще)? Или есть какие-то другие способы, заставить модель обойти все строки? Может с индексами какой-то трюк провернуть?
В общем, есть какие-то идеи и что я делаю не так?
Офлайн
PS разумеется, данные из БД кэшируются и возможна реализация постраничной загрузки. Но тормоза случаются и благодаря самой модели, независимо от этого, покуда она заполняет строки при прокрутке.
Офлайн
Покажите код.
Офлайн
reclosedev, едва ли найду его, т.к. решение отложено в виду сроков. Заполняю модель руками. Но если надо, то кратко, по памяти (экспериментировал много, это самый базовый вариант):
class Model(QAbstractTableModel): def __init__(self, parent): self.documents = list() # заполняем внутреннее хранилище из базы данных for document in mongo_database('products').find(): self.documents.append(document) def columnCount(self, parent=None): return 1 def rowCount(self, parent=None): return len(self.documents) def headerData(self, section, orientation, role): # проверяем положение и роль if section == 0: return 'Наименование' def data(self, index, role=Qt.DisplayRole): # здесь стандартные проверки на правильность индекса и роль, это значения не играет # ... if index.column() == 0: # для примера только 1 колонка return self.documents[index.row()]['name'] return None
Офлайн
Странно, что
Gennadyпотому что по коду все данные загружаются один раз и rowCount() возвращает правильное значение.
Листаешь быстро вниз, за полосу прокрутки - рывки.
Офлайн
reclosedev, не понимаю. Почему же рывки? Полагаю, здесь data(…) вызывается только по необходимости, при прокрутке.
Например, заполнение модели “вручную”, если брать или наследовать QStandardItemModel — такого эффекта не дает — получается в целом намного быстрее.
Офлайн