Сортировка QTableView обновляется медленно

У меня есть QTableView с QAbstractTableModel дочерним экземпляром, установленным в качестве модели. Ребенок реализует void sort(int columnt, Qt::SortOrder order). Я установил QTableView::sortEnabled(bool) на true, чтобы я мог сортировать свою таблицу, щелкнув заголовок столбца. Когда я щелкаю по заголовку, сортировка заканчивается почти мгновенно, но таблица обновляется только тогда, когда я перемещаю мышь в область таблицы. Нужно ли мне излучать какой-то сигнал от sort()? Или вызвать функцию для обновления QTableView?


person Nazar554    schedule 17.09.2013    source источник
comment
Немного сложно: испускать dataChanged(QModelIndex(), QModelIndex()); после сортировки   -  person Dmitry Sazonov    schedule 17.09.2013
comment
@DmitrySazonov, кажется, работает! добавишь ответ?   -  person Nazar554    schedule 17.09.2013
comment
Не возражаете ли вы опубликовать код для своей функции сортировки, я зашел так далеко, но не знаю, что добавить в переопределенную функцию сортировки, и, похоже, не могу найти никакой информации об этом...   -  person AngryDuck    schedule 07.10.2013
comment
@AngryDuck просто использует qSort в контейнере данных с оператором lessthan. реализовать оператор lessthen в зависимости от того, по каким критериям вы сортируете. если у вас возникли проблемы, задайте новый вопрос.   -  person Nazar554    schedule 08.10.2013


Ответы (1)


Немного сложно: испускать dataChanged(QModelIndex(), QModelIndex()); после сортировки.

Хочу отметить, что передача недопустимых индексов не документирована, но я часто использую это в своих проектах. Это работает хорошо и намного быстрее, чем передача действительных индексов с большими диапазонами, потому что обновляется только видимая область. Но у него могут быть некоторые глюки с тяжелыми делегатами / пользовательскими виджетами.

Я тестировал на QTreeView - обновление диапазона 10 тыс. элементов занимает около 1,5 секунды (выдача dataChanged с действительными индексами). И когда я использую недопустимые индексы, сигнал обрабатывается немедленно.

person Dmitry Sazonov    schedule 17.09.2013
comment
Я нашел в документе Qt, что вы должны использовать emit layoutChanged(). Я не знаю, как быстрее. - person Nazar554; 08.10.2013
comment
layoutChanged будет отправлен во все виды, которые подключены к модели. Это полезно, когда размер элементов должен быть пересчитан. Вы можете проверить это: stackoverflow. ком/вопросы/16444558/ - person Dmitry Sazonov; 08.10.2013