在 QTableView/QSortFilterProxy 中恢复原始顺序

suk*_*mel 5 c++ qt

我在视图和模型之间有一个QTableViewwith QSortFilterProxyModel( QStandardItemModel)。问题是当我调用 sort() 时,我无法恢复表中行的原始顺序。我试图通过将模型代理更改QIdentityProxy为即时但无济于事来实现这一点,因为唯一的变化是行重新编号但顺序保持排序。

是否有可能以某种方式“取消排序”数据?我认为,在这种情况下,该代码是不必要的,但会在询问时发布。

我在 Win x64 上使用 Qt5

PS:同样的问题于 2009年在这里发布,但从未得到回答。

fbu*_*cek 5

恢复初始未排序状态(已测试)

    sortModel->setSortRole(Qt::InitialSortOrderRole);
    sortModel->invalidate();
Run Code Online (Sandbox Code Playgroud)

QSortFilterProxyModel::?setSortRole(int role)


suk*_*mel 3

重点是手动排序,决定按列-1(恢复)排序和正常列号排序,并以某种方式拦截QHeaderView和之间的通信QSortFilterProxyModel

因此,利用 @vahancho 的回答中的一些见解,我成功地实现了这样的排序:

class ProxyModel : public QSortFilterProxyModel
{
    Q_OBJECT
public:
    ProxyModel(QObject* parent = 0);

signals:
    void askOrder(int column, Qt::SortOrder order);

public slots:
    //! override of automatically called function
    void sort(int column, Qt::SortOrder order) 
    { 
        emit askOrder(column, order); 
    }

    //! real sorting happens here
    void doSort(int column, Qt::SortOrder order) 
    { 
        QSortFilterProxyModel::sort(column, order); 
    }
};
Run Code Online (Sandbox Code Playgroud)

在父母这边,我进行了正确的连接并检查:

ResultsTable::ResultsTable(QWidget *parent) : QTableView(parent)
{
    /*...*/
    p_Header = new QHeaderView(this);
    p_Sort = new ProxyModel(this);
    connect(this, &ResultsTable::doSort, p_Sort, &ProxyModel::doSort);
    connect(p_Sort, &ProxyModel::askOrder, this, &ResultsTable::setSorting);
    /*...*/
    setSortingEnabled(true);
}

void ResultsTable::setSorting(int column, Qt::SortOrder order)
{
    if (p_Header->sortIndicatorOrder() == Qt::AscendingOrder && p_Header->isSortIndicatorShown() && m_PreviousSort == column)
    {
        p_Header->setSortIndicator(column, Qt::DescendingOrder);
        p_Header->setSortIndicatorShown(false);
        column = -1;
    }
    else
    {
        p_Header->setSortIndicatorShown(true);
    }
    m_PreviousSort = column;
    emit doSort(column, order);
}
Run Code Online (Sandbox Code Playgroud)

这样我就可以使用QTableViewwhen sortingEnabledis完成的自动排序处理true。我试图研究当单击表头以引发排序时 Qt 内部会发生什么,但失败了,因此停止使用此解决方案。

我仍然不确定这种方式是否QTableView负责设置正确的排序指示,而不是QHeaderView其本身(因为我认为此功能应该属于标头)。