Я реализовал кастом 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.
D’о!
Я был готов копаться в исходном коде Qt. Но когда я пошагово прошел по коду, я увидел, что курсор перешел на оператор return в случае «по умолчанию».
Я просто забыл добавить «перерыв» в мой коммутатор! Это была просто ошибка при провале: ((
Теперь он отлично работает с «layoutChanged».
Я только что сделал это. Сначала вы должны подключить сигнал заголовка к методу сортировки, который вы создали. Это пример Python, поэтому вам нужно адаптировать его для C ++:
model = SBStateTableModel()
table = QtGui.QTableView()
table.setModel(model)
table.setSortingEnabled(True)
Когда вы сортируете, весь вид изменится — или, по крайней мере, большая часть изменится. Так испуская modelReset
сигнал заставит вид измениться. Сброс модели является одним из самых неэффективных сигналов для вызова, поскольку он вызывает перерисовку всего представления. Тем не менее, большая часть представления в любом случае изменится.
emit modelReset();
Вы также можете испустить dataChanged
сигнал, указывающий, что все данные изменились. dataChanged
сигнал может быть быстрее.
self.dataChanged.emit(self.index(0, 0), self.index(self.rowCount()-1, self.columnCount()-1))
(испускающий сигнал dataChanged в подклассе QTableView)
auto m = model();
emit dataChanged (m->index(0, 0), m->index(m->rowCount()-1, m->columnCount()-1));