5

QAbstractModelItem から継承したカスタム階層モデルがあります。また、QSortFilterProxyModel からサブクラス化された MySortFilterProxyModel を実装します。MySortFilterProxyModel は、列を削除および交換できます。MySortFilterProxyModel の最初の列がモデルの最初の列に対応する場合、すべて正常に動作します。しかし、プロキシ モデルでスワップされた場合、ビューにいくつかの問題があります。しかし、展開しようとすると、子アイテムは表示されません。MySortFilterProxyModel メソッドの一部を次に示します。

    bool MySortFilterProxyModel::hasChildren(const QModelIndex &parent) const
    {
        if (parent.isValid() && parent.column() != 0)
            return false;
        QModelIndex source_parent = mapToSource(parent);
        return  sourceModel()->hasChildren( source_parent.sibling(source_parent.row(), 0) );
    }


    int MySortFilterProxyModel::rowCount(const QModelIndex &parent) const
    {
         if (parent.isValid() && parent.column() != 0)
            return 0;

        QModelIndex source_parent = mapToSource(parent);
        return sourceModel()->rowCount( source_parent.sibling(source_parent.row(), 0) );
    } 

デバッグ中に、 MySortFilterProxyModel::rowCount が正しいデータを返すことがわかりました。しかし、MyModel::rowCount は MySortFilterProxyModel::rowCount ではなく、QSortFilterProxyModel::index() から呼び出されることにも気付きました。それが問題なのですか?

したがって、特定の質問は、階層モデルで列を交換およびスイッチオフするためのプロキシモデルを実装する正しい方法は何ですか?

問題を解決するために私を助けてください。ありがとうございました。

4

1 に答える 1

4

詳細については、 Qt Model Testerを使用してみてください。

モデルに何か問題がある場合、これはアサーションで失敗します。アサーションが失敗した場合は、そのアサーションの上のコメントにあるモデル テスト コードを調べて、何が問題なのかを調べます。

モデル テスターをプロキシ モデルソース モデルに接続してください。そうしないと、ソース モデルのエラーによってプロキシが失敗する可能性があります。

于 2011-12-08T20:45:53.927 に答える