Qtのコントロール - ツリー
概要
Qtにおいて、QTreeWidget
クラスを使用してツリーをコントロールする手順を記載する。
Qt Designerにて、ツリーのコントロールIDをTreeとしている。
ツリーの作成
treeWidget->clear();
// ツリーの右側にアイテムの属性を表示するカラムを作成する
// 初期値は1である
treeWidget->setColumnCount(1);
アイテムの追加
子アイテムは、1つずつまたは複数の同時追加を行うことができる。
以下の例では、トップレベルアイテムから追加している。
// 追加するアイテムのリスト
QList<QTreeWidgetItem *> listItems;
// アイテムの構築
// QTreeWidgetItemの第1引数は親アイテム(複数のアイテムを追加する場合はNULLを指定する)
// 第2引数は表示文字列(複数のアイテムを追加する場合、QStringList型を指定する)
QTreeWidgetItem *Item = new QTreeWidgetItem((QTreeWidget *)NULL, QStringList(str));
listItems.append(Item);
// 複数のアイテムを追加した後、ツリーに追加する
// 第1引数はインデックス(インデックスは0から始まる)
Tree->insertTopLevelItems(0, listItems);
次に、トップレベルのアイテムに子アイテムを追加する。
アイテムの構築およびアイテムリストの作成までは上記と同様であるが、アイテムリストの追加だけ異なる。
// 子アイテムを追加したい親アイテムのポインタ
QTreeWidgetItem *pItem = ...;
// 親アイテムに追加
pItem->addChildren(listItems);
ツリーの展開時に追加する
宣言と同時に子アイテムを全て追加せずに、ツリーの展開時に子アイテムを追加する。
展開時に送信されるシグナルは、itemExpanded(QTreeWidgetItem *)
である。
引数のQTreeWidgetItem*
は展開時のアイテムを指しており、対応するスロットにより、引数のQTreeWidgetItem*
に対して子アイテムを追加する。
標準の設定では、子アイテムが存在しない場合、展開のツマミが表示されない。
展開のツマミを強制的に表示するには、アイテムの構築時に以下のようにプロパティを設定する。
アイテムの最後尾に達した場合、展開のツマミを非表示にする必要があるため、
item->setChildIndicatorPolicy(QTreeWidgetItem::DontShowIndicator);
を設定する。
item->setChildIndicatorPolicy(QTreeWidgetItem::ShowIndicator);
子アイテムの削除
上記のように、展開時にアイテムを追加する場合、まず、追加されている子アイテムを全て削除する必要がある。
一括して子アイテムを削除する場合は、QTreeWidgetItem::takeChildren
メソッドを実行する。
現在の階層を調べる
選択されたアイテムがトップレベルから数えて何階層目かを調べる場合、QTreeWidgetItem::parent
メソッドを使用する。
(QTreeWidgetItem::parent
メソッドにおいて、トップレベルアイテムだとNULL
を返すのを利用している)
QTreeWidgetItem *parent = item;
int nH = 0;
while(parent = parent->parent())
{
nH++;
}
アイテムにチェックボックスを追加する
ツリーのアイテムにチェックボックスを追加する場合、pItem->setCheckState(0, Qt::Checked);
を実行する。
チェックボックスの状態を取得する場合、QTreeWidget
クラスが送信するitemChanged
シグナルを使用する。
QObject::connect(Tree, SIGNAL(itemChanged(QTreeWidgetItem *, int)), this, SLOT(onChecked(QTreeWidgetItem *, int)));
受信するスロットの引数にチェックボックスの状態を持つアイテムが渡されるが、どのアイテムかは不明である。
そこで、アイテムに任意のデータを設定して、アイテムの場所を判別する方法がある。
例えば、アイテムをツリーに追加する前に、pItem->setData(0, Qt::UserRole, QVariant(5));
として、アイテムに"5"というユニークキーを設定する。
スロットでは、int n = pItem->data(0, Qt::UserRole).toInt();
を実行して、設定したデータを取得する。