2

Qt ライブラリ (バージョン 4.8) を使用するアプリケーションに取り組んでいます。

QStandardItemModel を持つ QTreeView があります。私のウィジェットは次のようになります。

アイテム1

サブアイテム11

サブアイテム12

アイテム2

サブアイテム21

サブアイテム22

アイテム3

サブアイテム31

サブアイテム32

QTreeView に項目を追加する方法は次のとおりです。

 model->setItem(0, 0, item1); 
 item1->setChild(0, 0, subitem12);

ユーザーがアイテムをダブルクリックしたときにのみアクションを実行したい (サブアイテムをクリックしても何もしない)。そこで、 doubleClicked(const QModelIndex & index)シグナルを使用します。

ユーザーがダブルクリックしたアイテム/サブアイテムに関する情報を処理したい。だから私は私のアイテム/サブアイテムの行を取得します:

index.row();

しかし、アイテム/サブアイテムを参照してその名前を表示したり、子があるかどうかを確認しようとするたびに、アイテムにしかアクセスできません:

index.model()->item(row)->text();

私の質問は、スロット内のサブアイテム (アイテムとサブアイテムの間のアイテム) にアクセスするにはどうすればよいですか? または、どうすればそれらが信号を発するのを防ぐことができますか? それらを無効にすることはできません。ユーザーにとって混乱を招く可能性があります。

編集:問題は、アイテムまたはサブアイテムをクリックして実行するたびに:

index.model()->item(row)->hasChildren();

また:

index.model()->item(row)->parent() == 0;

私は結果として真実になります。そのため、アイテムのみを参照できます。

私の質問は:サブアイテムを参照する正しい方法は何ですか?

4

3 に答える 3

2

行インデックスでモデル アイテムにアクセスしようとすると、モデルはその行の最上位アイテムを返します。itemFromIndex代わりに使用してください:

auto item = index.model()->itemFromIndex(index);
if (item && item->hasChildren()){
    // item is not a leaf
}

EDIT index.model()は を返すQAbstractItemModel*ため、ここでもキャストが必要です (または、コード内のどこかに標準モデルへのポインターを格納することをお勧めします)。

于 2016-02-24T20:46:23.863 に答える
0

You can't disable the signal for the subitems. However, you can check if an item has a parent. It it doesn't, it is an item and if it does, it's a subitem.

if (item->parent() != 0)
   .. //subitem
else
   .. //item

An alternative would be to use the data() function to set some special value to distinguish between the two.

item1->setData(QVariant("item"));
subitem1->setData(QVariant("subitem"));

Then query the value in your doubleclick handler:

QVariant var = item->data();
if (var.toString() == "item")
  ...
else if (var.toString() == "subitem")
  ...
于 2016-02-24T18:15:29.843 に答える