1

我想知道如何确保在QTableView模型上执行编程排序时更新 a 的水平标题中的排序指示符。

这是问题所在:

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:在 setSortingEnabled(true) 之后立即乙:紧接着 model.sort(0,Qt::AscendingOrder)

如您所见,排序指示符保持不变,因此与实际排序顺序不一致。

在我的应用程序中,我有两个与同一模型交互的视图,并且可以从它们中的任何一个触发排序。我在 QAbstractItemModel 中看不到任何表明何时执行排序的信号。似乎 QHeaderView/TableView 假设它们是唯一可以触发排序的东西。

Qt 是否提供了应对我所缺少的这一点的设施?如果不是,那么在不过多破坏模型上多个视图的封装的情况下,保持排序指示器最新的最佳方法是什么?

4

2 回答 2

3

ItemDataRole自 Qt 4.8 起可用的枚举器之一是InitialSortOrderRole.

http://qt-project.org/doc/qt-4.8/qt.html#ItemDataRole-enum

因此应该可以通过该QAbstractItemModel::headerData方法传输排序顺序信息。

但是,我已经尝试过,发现QTableView并且QHeaderView似乎没有更新以响应此 headerData 角色的更改。自定义标题视图似乎是必要的......

这可能是值得的,因为通过模型传递此信息允许任意数量的视图同步,而无需任何外部代理跟踪存在的所有视图以便它可以分发通知。它还可以通过模型代理堆栈(例如使用QSortFilterModelProxy.

于 2014-06-03T09:46:35.933 回答
0

我想出的避免过多破坏封装的解决方案是

  • 在每个视图上都有一个信号(在QTableView信号上sortIndicatorChanged就足够了,在我的自定义视图上我添加了一个类似的信号)。
  • connect对这些信号的意见的管理者
  • 当任何视图发出这样的信号时,视图管理器会在所有其他视图上调用一个槽,以便它们可以同步它们的排序指示器

我仍然觉得我可能遗漏了一些东西——这肯定是一个普遍的问题吗?在我看来,QAbstractItemModel应该有一种将排序信息传输到视图的方法......

于 2014-06-03T08:54:29.557 回答