Найти - Пользователи
Полная версия: QAbstractTableModel и динамическая подгрузка данных
Начало » GUI » QAbstractTableModel и динамическая подгрузка данных
1
Gennady
Всем привет!

Столкнулся с небольшой проблемой динамической подгрузки данных. Заполняю модель из базы данных, перегружая методы columnCount, rowCount и data. Представление запрашивает поначалу первые 3-4 десятка строк, зависимо от размера окна. При попытке прокрутки строк, изменения размеров окна — получаются тормоза и рывки, до подвисаний. Понятное дело, метод data дергается и при шевелении мышкой, с Qt.DisplayRole. Хорошо бы обойти строки “раз и навсегда”.

Получается, перегрузка данных методов не является достаточной. Может есть смысл выгружать все данные из базы данных и вручную заполнять все строки (insertRow или как-то еще)? Или есть какие-то другие способы, заставить модель обойти все строки? Может с индексами какой-то трюк провернуть?

В общем, есть какие-то идеи и что я делаю не так?
Gennady
PS разумеется, данные из БД кэшируются и возможна реализация постраничной загрузки. Но тормоза случаются и благодаря самой модели, независимо от этого, покуда она заполняет строки при прокрутке.
reclosedev
Покажите код.
Gennady
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

В общем-то и всё. Заполнение модели самое обычное. Рывки происходят от того, что модель не заполняется полностью. Листаешь быстро вниз, за полосу прокрутки - рывки.
reclosedev
Странно, что
Gennady
Листаешь быстро вниз, за полосу прокрутки - рывки.
потому что по коду все данные загружаются один раз и rowCount() возвращает правильное значение.
Gennady
reclosedev, не понимаю. Почему же рывки? Полагаю, здесь data(…) вызывается только по необходимости, при прокрутке.

Например, заполнение модели “вручную”, если брать или наследовать QStandardItemModel — такого эффекта не дает — получается в целом намного быстрее.
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