关键是在按列-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);
}
};
在父母方面,我进行了适当的连接和检查:
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);
}
这样我可以使用QTableView
when sortingEnabled
is完成的自动排序处理true
。我试图研究当单击表头以诱导排序时 Qt 内部发生了什么,但失败了,因此停止使用此解决方案。
我仍然不确定这种方式QTableView
是否正确负责设置正确的排序指示,而不是QHeaderView
它本身(因为我认为这个功能应该属于标题)。