【发布时间】:2014-06-02 11:46:21
【问题描述】:
我想知道如何确保在对模型执行编程排序时更新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)
甲:乙:
如您所见,排序指示符保持不变,因此与实际排序顺序不一致。
在我的应用程序中,我有两个与同一个模型交互的视图,并且可以从它们中的任何一个触发排序。我在 QAbstractItemModel 中看不到任何指示何时执行排序的信号。似乎 QHeaderView/TableView 假设它们是唯一可以触发排序的东西。
Qt 是否提供了处理我所缺少的这个的工具?如果不是,那么在不过多破坏模型上多个视图的封装的情况下,保持排序指示器最新的最佳方法是什么?
【问题讨论】:
-
我认为排序的发起者应该是视图而不是模型。因此,您可以使用
QTableView::sortByColumn()函数,IMO 也应该设置排序指示器。 -
谢谢@vahancho。在我的应用程序中,用户可以从两个视图之一触发排序。在这种情况下,我希望表视图中的排序指示器能够正确同步。我希望这样做,而视图不必直接相互交互......
-
如果是这样,您可以为每个视图调用
QTableView::sortByColumn(),而不是调用模型的sort()。 -
但这会导致模型多次排序,不是吗?此外,它还要求每个视图“了解”其他视图,这在某种程度上打破了封装:并非所有视图都将始终存在。
标签: qt qtableview qt4.8 qabstractitemmodel qheaderview