Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在模型排序时更新QTableView/QHeaderView中的排序顺序指示器_Qt_Qtableview_Qt4.8_Qabstractitemmodel_Qheaderview - Fatal编程技术网

在模型排序时更新QTableView/QHeaderView中的排序顺序指示器

在模型排序时更新QTableView/QHeaderView中的排序顺序指示器,qt,qtableview,qt4.8,qabstractitemmodel,qheaderview,Qt,Qtableview,Qt4.8,Qabstractitemmodel,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.

我想知道如何确保在对模型执行编程排序时更新
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)
QStandardItemModel(3,1);
QTableView视图;
view.setModel(&model);
//填充模型,确保其不按排序顺序排列
对于(int row=0;row
A:B:

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

在我的应用程序中,我有两个与同一个模型交互的视图,可以从它们中触发排序。我在QabstracteModel中没有看到任何在执行排序时发出信号的东西。QHeaderView/TableView似乎认为它们是唯一可以触发排序的东西


Qt是否提供了处理我所缺少的问题的工具?如果没有,那么在不过度破坏模型上多个视图的封装的情况下,保持排序指示器最新的最佳方法是什么?

我提出的避免过度破坏封装的解决方案是

  • 要在每个视图上都有一个信号(在
    QTableView
    上,
    sortinicator或changed
    信号就足够了,在我的自定义视图上,我添加了一个类似的信号)
  • 视图管理器连接这些信号
  • 当任何视图发出此类信号时,视图管理器调用所有其他视图上的插槽,以便它们可以同步其排序指示器

我仍然觉得我可能遗漏了什么——这肯定是一个常见的问题吗?在我看来,
qabstractemmodel
应该有一种将排序顺序信息传输到视图的方法…

一个可用的
ItemDataRole
枚举器,因为qt4.8是
InitialSortOrderRole

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

但是,我尝试过这个方法,发现
QTableView
QHeaderView
似乎没有随着headerData角色的变化而更新。自定义标题视图似乎是必要的


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

构建的模型代理堆栈。我认为排序的发起人应该是视图而不是模型。因此,您可以使用
QTableView::sortByColumn()
函数,在我看来,该函数也应该设置排序指示符。谢谢@vahancho。在我的应用程序中,用户可以从两个视图中的一个触发排序。在这种情况下,我希望表视图中的排序指示器正确同步。我希望这样做时,视图之间不必直接交互……如果是这样,您可以为每个视图调用
QTableView::sortByColumn()
,而不是调用模型的
sort()
。但这会导致对模型进行多次排序,不是吗?它还要求每个视图“知道”其他视图,这在某种程度上破坏了封装:并非所有视图都会一直存在。