Страниц: 1 2 [ 3] 4 5 ... 10
|
21
: Сентября 13, 2025, 00:58
|
|
Автор demaker - Последний ответ от demaker
|
Не получается выделить несколько строк. Делаю так: 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(); } }
|
|
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); } } }
Пробовал делать Но увы не помогает((
|
Страниц: 1 2 [ 3] 4 5 ... 10 |