Russian Qt Forum
Сентября 13, 2025, 11:34 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: ModelView большое количество данных  (Прочитано 609 раз)
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4750



Просмотр профиля WWW
« Ответ #15 : Сентября 11, 2025, 12:09 »

еще можно свою модель погонять через QAbstractItemModelTester https://wiki.qt.io/Model_Test
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
demaker
Птица говорун
*****
Offline Offline

Сообщений: 973


Просмотр профиля
« Ответ #16 : Сентября 12, 2025, 13:20 »

Код:
void Model::update(std::vector<Type> &fresh)
{
    int prvsz = store.size();
    int cursz = fresh.size();
 
    beginInsertRows(QModelIndex(), prvsz, cursz);
    store.swap(fresh);
    endInsertRows();
}

это кстати будет работать только если в новом векторе рядов больше чем в старом


Да, согласен)

Сделал вот так

Код
C++ (Qt)
 
void Model::upDate(std::vector<typedata> &fresh, QTreeview *view)
{
 
 int prvsz = v.size();
 int cursz = fresh.size();
 int count = cursz - prvsz;
 
if (count>0) {
 
     beginInsertRows(QModelIndex(), prvsz, cursz - 1);
     v.swap(fresh);
     endInsertRows();
}
else if(count==0){  
 QRect viewportRect = view->viewport()->rect();
 
 QModelIndex topLeft = view->indexAt(viewportRect.topLeft());
 QModelIndex bottomRight = view->indexAt(viewportRect.bottomRight());
 
  if(topLeft.isValid() && bottomRight.isValid()){
       dataChanged(topLeft,bottomRight);
   }
}
else {
 
 beginInsertRows(QModelIndex(), cursz , prvsz - 1);
 v.swap(fresh);
 endInsertRows();
}
 }
 
 
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 973


Просмотр профиля
« Ответ #17 : Сентября 12, 2025, 13:25 »

Вообще SortFilterProxyModel может быть источником тормозов в том числе
Она хорошая для простых кейзов, для сложных лучше писать сортировку руками
Почему может не работать - хз надо читать код а мне лень
может где-то контракт модели нарушен но в приведенном коде вроде всё ок

Сортировка работает, но фильтрация увы ((...

Сделаю фильтрацию во время формирования вектора данных модели)

Ну при этом у меня потеряется селектор блин, т.к индексы эементов будут другие

И как тогда?..
« Последнее редактирование: Сентября 12, 2025, 14:00 от demaker » Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2133



Просмотр профиля
« Ответ #18 : Сентября 12, 2025, 14:12 »

Кажется, что в модельке не стоит обращаться ко view

Если правильно понял, ты тут обновляешь больше ячеек чем сообщаешь через dataChanged. Оно может быть критичным для моделей сортировки и фильтрации
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2133



Просмотр профиля
« Ответ #19 : Сентября 12, 2025, 14:19 »

Ты ещё пишешь про unordered_map->vector. Если там простой std::copy, то полагаю, что строки в векторе могут перетасовываться = достаточно сложно вычислить какие индексы в модели обновились
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 973


Просмотр профиля
« Ответ #20 : Сегодня в 12:52 am »

Ты ещё пишешь про unordered_map->vector. Если там простой std::copy, то полагаю, что строки в векторе могут перетасовываться = достаточно сложно вычислить какие индексы в модели обновились

Делаю вот так

Код
C++ (Qt)
 
void container::add_mapping(Key key, Type &value)
{
   std::lock_guard<std::mutex> l(mutex);
   auto it = unordered_map.find(key);
   if(it == unordered_map.end()){
          Type *data = new Type;
          unordered_map.insert(std::make_pair(key, data));
          vectror.push_back(data);    
   }
   else{
         *(it.operator->()->second) = value;
   }
 
}
 
std::vector<Type> container::get_vector()
{
      std::lock_guard<std::mutex> l(mutex);
      std::vector<Type> v;
      for(auto e : vector){
           v.push_back(*e);
      }      
      return v;
}
 
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 973


Просмотр профиля
« Ответ #21 : Сегодня в 12:58 am »

Используй QTreeView с uniformRowHeights=true https://doc.qt.io/qt-6/qtreeview.html#uniformRowHeights-prop - так оно будет вычислять скроллбар как firstRowHeight*rowCount() а не суммировать в цикле.

Не получается выделить несколько строк.

Делаю так:
Код
C++ (Qt)
void  TreeView::mousePressEvent(QMouseEvent *e)
{
   if(e->modifiers() & Qt::Controlmodifier)
  {
      QModelIndex idx = indexAt(e->pos());
 
      QModelIndex topLeft = model()->index(idx.row(), 0, QModelIndex());
      QModelIndex bottomRight = model()->index(idx.row(), model()->columnCount() - 1, QModelIndex());
 
      QItemSelection selection(topLeft, bottomRight);
      selectionModel()->select(selection, QItemSelectionModel::Select);
  }
 
  return QTreeView::mousePressEvent(e);
}
 

Это связано с тем что tablemodel привязана к treview?
Или в коде проблема?

« Последнее редактирование: Сегодня в 01:10 am от demaker » Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.046 секунд. Запросов: 22.