我在视图和模型之间有一个QTableView
with QSortFilterProxyModel
( QStandardItemModel
)。问题是当我调用 sort() 时,我无法恢复表中行的原始顺序。我试图通过将模型代理更改QIdentityProxy
为即时但无济于事来实现这一点,因为唯一的变化是行重新编号但顺序保持排序。
是否有可能以某种方式“取消排序”数据?我认为,在这种情况下,该代码是不必要的,但会在询问时发布。
我在 Win x64 上使用 Qt5
PS:同样的问题于 2009年在这里发布,但从未得到回答。
恢复初始未排序状态(已测试)
sortModel->setSortRole(Qt::InitialSortOrderRole);
sortModel->invalidate();
Run Code Online (Sandbox Code Playgroud)
QSortFilterProxyModel::?setSortRole(int role)
重点是手动排序,决定按列-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)
这样我就可以使用QTableView
when sortingEnabled
is完成的自动排序处理true
。我试图研究当单击表头以引发排序时 Qt 内部会发生什么,但失败了,因此停止使用此解决方案。
我仍然不确定这种方式是否QTableView
负责设置正确的排序指示,而不是QHeaderView
其本身(因为我认为此功能应该属于标头)。
归档时间: |
|
查看次数: |
4789 次 |
最近记录: |