5

ビューとモデル ( ) の間にwithQTableViewがあります。問題は、sort() を呼び出すと、テーブル内の行の元の順序を復元できないことです。モデルプロキシをオンザフライに変更することでそれを達成しようとしていましたが、無駄になりました。唯一の変更は行の番号が付け直されているが、順序はソートされたままであるためです。QSortFilterProxyModelQStandardItemModelQIdentityProxy

どういうわけかデータを「ソート解除」することは可能ですか? この場合、そのコードは不要だと思いますが、質問があれば投稿します。

Win x64でQt5を使用しています

PS: 同じ問題が 2009 年にここに投稿されましたが、回答はありませんでした。

4

6 に答える 6

5

初期のソートされていない状態を復元するには (テスト済み)

    sortModel->setSortRole(Qt::InitialSortOrderRole);
    sortModel->invalidate();

QSortFilterProxyModel:: setSortRole(int ロール)

于 2015-01-23T10:15:27.243 に答える
3

ポイントは、列 -1 による並べ替え (復元) と通常の列番号の間で手動で並べ替えを決定し、 と の間の通信QHeaderViewQSortFilterProxyModel何らかの方法で傍受することです。

したがって、@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 sortingEnabledisによって行われる自動ソート処理を使用できますtrue。テーブルヘッダーをクリックしてソートを誘発したときにQt内で何が起こるかを調査しようとしましたが、失敗したため、このソリューションで停止しました。

QTableViewこの方法がそれ自体ではなく、正しい並べ替え表示を設定する責任があることが正しいかどうかはまだわかりませんQHeaderView(この機能はヘッダーに属するべきだと思っていたので)。

于 2013-09-10T10:16:21.617 に答える