Сортировка QtTableModel — QTableView не обновляется

Я реализовал кастом QAbstractTableModel и я использую std::vector для моих объектов данных.

Теперь я хотел реализовать метод sort (), чтобы отсортировать таблицу по столбцам.
Вот в основном то, что я делаю:

void SBStateTableModel::sort (int column, Qt::SortOrder order)
{
emit layoutAboutToBeChanged();

switch (column)
{
case Address:
if (order == Qt::DescendingOrder)
std::sort(states.begin(), states.end(), addr_comp_desc);
else
std::sort(states.begin(), states.end(), addr_comp_asc);

default:
return;
}

emit layoutChanged();
}

Но испуская layoutChanged() один не перерисовывает вид. При выделении строки и циклическом просмотре они обновляются по мере их выделения.

В документации также говорится об обновлении постоянных индексов. Некоторые люди здесь считают, что это на самом деле не обязательно.
Я даже не уверен, как это сделать. Получение списка с persistentIndexList() и тогда я должен разобрать это. Но std::sort не является стабильным видом Я не уверен, как сопоставить постоянные индексы с моими векторными индексами.

РЕДАКТИРОВАТЬ:
В «деле» отсутствовал просто «перерыв»! Таким образом, функция будет возвращаться до выдачи сигнала layoutChanged.

2

Решение

D’о!

Я был готов копаться в исходном коде Qt. Но когда я пошагово прошел по коду, я увидел, что курсор перешел на оператор return в случае «по умолчанию».

Я просто забыл добавить «перерыв» в мой коммутатор! Это была просто ошибка при провале: ((
Теперь он отлично работает с «layoutChanged».

3

Другие решения

Я только что сделал это. Сначала вы должны подключить сигнал заголовка к методу сортировки, который вы создали. Это пример Python, поэтому вам нужно адаптировать его для C ++:

model = SBStateTableModel()
table = QtGui.QTableView()
table.setModel(model)

table.setSortingEnabled(True)

Когда вы сортируете, весь вид изменится — или, по крайней мере, большая часть изменится. Так испуская modelReset сигнал заставит вид измениться. Сброс модели является одним из самых неэффективных сигналов для вызова, поскольку он вызывает перерисовку всего представления. Тем не менее, большая часть представления в любом случае изменится.

emit modelReset();

Вы также можете испустить dataChanged сигнал, указывающий, что все данные изменились. dataChanged сигнал может быть быстрее.

Python:

self.dataChanged.emit(self.index(0, 0), self.index(self.rowCount()-1, self.columnCount()-1))

C ++:

(испускающий сигнал dataChanged в подклассе QTableView)

auto m = model();
emit dataChanged (m->index(0, 0), m->index(m->rowCount()-1, m->columnCount()-1));
1

По вопросам рекламы [email protected]