2016-08-17 4 views
2

私はQAbstractTableModelの実装をunittestしようとしています。私はrowCount()、columnCount()およびdata()メソッドを実装しています。親インデックスは常に無効である私のモデルをインスタンス化した後有効な親を持つQModelIndexを構築する方法は?

は、どんなに多くのネストの深い、:今すぐ

parent = model->index(0, 0); 
i = model->index(0, 0, parent); // i.parent().IsValid() == false! 

、私は有効ではありません。しかし、i.parent()はそうではありません。 私はさらにネストの場合でも:その後も

ancestor = model->index(0, 0); 
parent = model->index(0, 0, ancestor); 
i = model->index(0, 0, parent); // i.parent().IsValid() == false! 

を、私は有効ですが、i.parent()ではありません。

私はユニットがrowCountとcolumnCountメソッドをテストしており、そのモデルがネストされた2行の1つの行を持つツリーモデルであると主張しました。また、列数はゼロではありません。

親インデックスは常に無効ですか?

+0

あなたは実際に '私の親を設定していますか? – Dillydill123

+1

ツリーモデルを作成する場合は、 'QAbstractTableModel'ではなく' QAbstractItemModel'から派生する必要があります – RobbieE

答えて

4

テーブルです。それは木ではありません。そのため、親は常に無効になります。 QAbstractTableModel::indexの実装では、常に無効な親を設定しています。

あなたの期待は、テーブルモデルではなくツリーモデルに適用されます。また、指定された親要素に子がある場合は、ツリーモデルにのみ適用されます。あなたのテストでは、使用している親が子供を持っていると誤って認識します。あなたは簡単にそれを確認することができます:model->hasChildren(parent)はいつもテーブルのためにfalseを返します。子なしの親を持つ索引を作成しようとすると、未定義です。理想的には、あなたのモデルはそれを主張するべきです。したがって、あなたのテストは一般的にツリーに対して間違っているでしょう。

ツリーを実装する場合は、QAbstractItemModelから派生します。 bool hasChildren(const QModelIndex& parent) constを正しく実装するように強制されます。これは、ツリービュー(およびテスト)が、指定された親の子のインデックスを要求するのが有効かどうかを判断する方法です。

一般に、model.hasChildren(parent) == falseの場合は、model.index(row, col, parent)に電話することは決してありません。実際、あなたのモデルはそれがそうであると主張しなければなりません:

QModelIndex MyModel::index(int row, int col, const QModelIndex & parent) { 
    Q_ASSERT(hasChildren(parent)); 
    Q_ASSERT(row >= 0 && row < rowCount(parent)); 
    Q_ASSERT(col >= 0 && col < columnCount(parent)); 
    void * ptr = ...; // or quintptr ptr = ...; 
    return createIndex(row, col, ptr); 
} 
+0

QAbstractTableModelをQTreeViewで使用することはなぜ可能ですか? (例:ここではhttp://stackoverflow.com/questions/27308309/display-data-from-qabstracttablemodel-in-qtreeview)これも同じ前提条件では機能しませんか?また、私が使用している親には子供がいます。データメソッドを実装しました。私は前進をどのように提案しますか? :: indexメソッドをオーバーライドしますか? – Diana

+1

'QTreeView'は、各親に子をチェックし、子が存在する場合にのみ子インデックスを作成しようとします。ツリービューは、テーブルまたはリストモデルを表示するための完全に有効な方法です。テーブル/リストモデルは、トランクだけのツリーです。 –

+0

#1。 「子供」の正確な定義は何ですか?私はparent()を検査してデータを返すようにdata()メソッドを実装しました。それは私の子供です。 #2。どのような選択肢がありますか?私はQAbstractTreeModelを見つけることができません。 – Diana

関連する問題