Model/View Qt文档中关于排序的描述可能有误?

The description about sorting in Model/View Qt document maybe wrong?

在Qt在线文档Model/View编程中,据说如果你的模型是可排序的,即如果它重新实现了QAbstractItemModel::sort()函数,QTableViewQTreeView提供一个 API 允许您以编程方式对模型数据进行排序。此外,您可以启用交互式排序(即允许用户通过单击视图的 headers 对数据进行排序),方法是将 QHeaderView::sortIndicatorChanged() signal 连接到 QTableView::sortByColumn() slotQTreeView::sortByColumn() slot, 分别。 但是,首先 QTableView::sortByColumn() 不是插槽,因此不能将信号连接到它;其次,QTableView::sortByColumn() 的代码类似于

d->header->setSortIndicator(column, order);
//If sorting is not enabled, force to sort now.
if (!d->sortingEnabled)
    d->model->sort(column, order);

QHeaderView::setSortIndicator() 函数发出 sortIndicatorChanged(logicalIndex, order)。但是如果使用函数 setSortingEnabled(true),信号 sortIndicatorChanged(logicalIndex, order) 也可以在单击视图的 header 列时由视图 header 自动发出。

所以也许正确的方法是制作一个插槽来接收信号sortIndicatorChanged(logicalIndex, order),并在插槽中调用模型的覆盖虚函数sort()

通过单击列对树视图进行排序。

  1. 设置视图可以通过点击"header"排序。

    treeView_->setSortingEnabled(true);
    
  2. 将 header 信号连接到您创建的插槽。

    connect(headerView, SIGNAL(sortIndicatorChanged(int, Qt::SortOrder)),
        treeModel_, SLOT(sortByColumn(int, Qt::SortOrder)));
    
  3. 槽中,调用模型的sort()虚函数。 sort() virtual function是QAbstractItemModel的一个虚函数,应该覆盖它。

    void TreeModel::sortByColumn(int column, Qt::SortOrder order)
    {
        sort(column, order);
    }
    
  4. 重写 sort() 函数,就像您的模型应该做的那样。

  5. emit dataChanged(QModelIndex(), QModelIndex()); 从一个模型更新整个树视图。