ポイントは、列 -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
(この機能はヘッダーに属するべきだと思っていたので)。