Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » QAbstractTableModel и динамическая подгрузка данных [RSS Feed]

#1 Окт. 2, 2013 22:55:45

Gennady
Зарегистрирован: 2013-09-19
Сообщения: 27
Репутация: +  1  -
Профиль   Отправить e-mail  

QAbstractTableModel и динамическая подгрузка данных

Всем привет!

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

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

В общем, есть какие-то идеи и что я делаю не так?

Офлайн

#2 Окт. 2, 2013 23:00:51

Gennady
Зарегистрирован: 2013-09-19
Сообщения: 27
Репутация: +  1  -
Профиль   Отправить e-mail  

QAbstractTableModel и динамическая подгрузка данных

PS разумеется, данные из БД кэшируются и возможна реализация постраничной загрузки. Но тормоза случаются и благодаря самой модели, независимо от этого, покуда она заполняет строки при прокрутке.

Офлайн

#3 Окт. 6, 2013 13:42:45

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

QAbstractTableModel и динамическая подгрузка данных

Покажите код.

Офлайн

#4 Окт. 7, 2013 21:33:39

Gennady
Зарегистрирован: 2013-09-19
Сообщения: 27
Репутация: +  1  -
Профиль   Отправить e-mail  

QAbstractTableModel и динамическая подгрузка данных

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

В общем-то и всё. Заполнение модели самое обычное. Рывки происходят от того, что модель не заполняется полностью. Листаешь быстро вниз, за полосу прокрутки - рывки.

Офлайн

#5 Окт. 8, 2013 19:53:36

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

QAbstractTableModel и динамическая подгрузка данных

Странно, что

Gennady
Листаешь быстро вниз, за полосу прокрутки - рывки.
потому что по коду все данные загружаются один раз и rowCount() возвращает правильное значение.

Офлайн

#6 Окт. 10, 2013 02:35:32

Gennady
Зарегистрирован: 2013-09-19
Сообщения: 27
Репутация: +  1  -
Профиль   Отправить e-mail  

QAbstractTableModel и динамическая подгрузка данных

reclosedev, не понимаю. Почему же рывки? Полагаю, здесь data(…) вызывается только по необходимости, при прокрутке.

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

Офлайн

  • Начало
  • » GUI
  • » QAbstractTableModel и динамическая подгрузка данных[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version