Обновление индикатора порядка сортировки в QTableView/QHeaderView при сортировке модели

Я хочу знать, как обеспечить индикатор сортировки в горизонтальном заголовке QTableView обновляется, когда на модели выполняется программная сортировка.

Вот проблема:

QStandardItemModel model(3,1);
QTableView view;
view.setModel( &model );

// Populate the model ensuring it is not in a sorted order
for( int row = 0; row < model.rowCount(); ++row )
{
    model.setItem( row , 0 ,
                   new QStandardItem(QString::number((row+1)%model.rowCount())));
}

view.setSortingEnabled( true );
// At this point everything is consistent since enabling the sorting
// triggers a sort that matches the indicator in the horizontalHeader (see A)

model.sort( 0 , Qt::AscendingOrder );
// However at this point the sort order has been reversed but the
// header's sort indicator remains unchanged (see B)

A: A: сразу после setSortingEnabled (true B:Сразу после model.sort (0, Qt:: AscendingOrder

Как видите, индикатор сортировки остается неизменным и, следовательно, не соответствует фактическому порядку сортировки.

В моем приложении у меня есть два представления, которые взаимодействуют с одной моделью, и сортировка может быть вызвана любым из них. Я не вижу ничего в QAbstractItemModel, который сигнализировал бы, когда сортировка была выполнена. Кажется, что QHeaderView/TableView предполагают, что они - единственное, что может вызвать сортировку.

Предоставляет ли Qt возможности справиться с этим, что мне не хватает? Если нет, то каков наилучший способ поддерживать индикатор сортировки в актуальном состоянии, не слишком нарушая инкапсуляцию множества представлений в модели?

2 ответа

Решение

Один из ItemDataRole перечислители, доступные с Qt 4.8 InitialSortOrderRole,

http://qt-project.org/doc/qt-4.8/qt.html

Следовательно, должна быть возможность передавать информацию о порядке сортировки через QAbstractItemModel::headerData метод.

Я попробовал это однако и обнаружил, что QTableView а также QHeaderView не обновляется в ответ на изменения в этой роли headerData. Настроенный вид заголовка был бы необходим...

Это может стоить того, поскольку передача этой информации через модель позволяет синхронизировать любое количество представлений, при этом никакой внешний агент не должен отслеживать все существующие представления, чтобы он мог распространять уведомления. Он также будет бесперебойно работать через модели стеков прокси, таких как QSortFilterModelProxy,

Решение, которое я придумала, чтобы не нарушать инкапсуляцию слишком много

  • иметь сигнал на каждом просмотре (на QTableView sortIndicatorChanged Достаточно сигнала, и на мой пользовательский вид я добавил аналогичный сигнал).
  • менеджер просмотров connectс этими сигналами
  • когда какое-либо представление генерирует такой сигнал, менеджер представлений вызывает слот для всех остальных представлений, чтобы они могли синхронизировать свои индикаторы сортировки

Я все еще чувствую, что могу что-то упустить - конечно, это общая проблема? Мне кажется, что QAbstractItemModel должен иметь способ передачи информации о порядке сортировки в представления...

Другие вопросы по тегам