重點是手動按列-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
完成的自動分揀處理,當sortingEnabled
是true
。我試圖研究當點擊表頭被誘導排序時發生的Qt內部事件,但失敗了,因此停止使用此解決方案。
我還不確定是否正確,QTableView
負責設置正確的排序指示,而不是QHeaderView
本身(因爲我認爲這個功能應該屬於標題)。
這太棒了!它使每個標題像一個三態按鈕,並且視圖的默認狀態是未排序的。 – phyatt