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

Войти
 
   Начало   Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
Страниц: 1 2 [3] 4 5 ... 10
 21 
 : Сентября 13, 2025, 00:58 
Автор demaker - Последний ответ от demaker
Используй 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?
Или в коде проблема?


 22 
 : Сентября 13, 2025, 00:52 
Автор demaker - Последний ответ от demaker
Ты ещё пишешь про 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;
}
 

 23 
 : Сентября 12, 2025, 14:19 
Автор demaker - Последний ответ от __Heaven__
Ты ещё пишешь про unordered_map->vector. Если там простой std::copy, то полагаю, что строки в векторе могут перетасовываться = достаточно сложно вычислить какие индексы в модели обновились

 24 
 : Сентября 12, 2025, 14:12 
Автор demaker - Последний ответ от __Heaven__
Кажется, что в модельке не стоит обращаться ко view

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

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

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

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

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

И как тогда?..

 26 
 : Сентября 12, 2025, 13:20 
Автор demaker - Последний ответ от demaker
Код:
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();
}
 }
 
 

 27 
 : Сентября 11, 2025, 12:09 
Автор demaker - Последний ответ от kambala
еще можно свою модель погонять через QAbstractItemModelTester https://wiki.qt.io/Model_Test

 28 
 : Сентября 11, 2025, 02:13 
Автор demaker - Последний ответ от Авварон
Вообще SortFilterProxyModel может быть источником тормозов в том числе
Она хорошая для простых кейзов, для сложных лучше писать сортировку руками
Почему может не работать - хз надо читать код а мне лень
может где-то контракт модели нарушен но в приведенном коде вроде всё ок

 29 
 : Сентября 11, 2025, 02:11 
Автор demaker - Последний ответ от Авварон
Код:
void Model::update(std::vector<Type> &fresh)
{
    int prvsz = store.size();
    int cursz = fresh.size();
 
    beginInsertRows(QModelIndex(), prvsz, cursz);
    store.swap(fresh);
    endInsertRows();
}

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

 30 
 : Сентября 10, 2025, 16:28 
Автор demaker - Последний ответ от demaker
Блин после того как сделал почему-то фильтрация отвалилась
Код
C++ (Qt)
class Model : public ...
{
private:
 std::vector<Type> store;
}
 
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)
Widget::Widget(...) : ...
{
  model = new TableModel(..., this);
  sort = new SortFilterProxyModel(this);
  sort->setSourceModel(model);
  treeview = new TreeView(this);
  treeview->setModel(sort);
}
 

Код
C++ (Qt)
void Widget::updateModel()
{
 
     int cursz = v.size();      
     int prvsz = wgtvec.size();
     int count = cursz- prvsz;
 
     if(count > 0){
 
        std::vector<Type> v = threadsafe_unordered_map.getVector();        
        model->update(v);
 
      }
      else if(count == 0){
 
        QRect viewportRect = tableView->viewport()->rect();
 
        QModelIndex topLeft = tableView->indexAt(viewportRect.topLeft());
        QModelIndex bottomRight = tableView->indexAt(viewportRect.bottomRight());
 
         if(topLeft.isValid() && bottomRight.isValid()){
 
              model->dataChanged(topLeft,bottomRight);
 
        }
      }
}
 

Пробовал делать
Код:
sort->dataChanged(...)

Но увы не помогает((

Страниц: 1 2 [3] 4 5 ... 10

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