Runner in the High

技術のことをかくこころみ

QTreeViewのチェックボックスについてのメモ

QTreeViewのアイテムにチェックボックスを付ける処理でかなり悩んだのでメモ

QTreeViewのチェックボックス

見た感じは、なんというか、簡単にできそうなものだが
どこでチェックボックスを表示させるようにするかが今回のお悩みポイントである。

まず最初にあったのは、次のようなミスだった:
void MainWindow::MakeTreeViewColumns(void)
{
columns = new QStandardItemModel(0, 5);

columns->setHeaderData(0, Qt::Horizontal, tr("HEADER1"));
columns->setHeaderData(1, Qt::Horizontal, tr("HEADER2"));
columns->setHeaderData(2, Qt::Horizontal, tr("HEADER3"));
columns->setHeaderData(3, Qt::Horizontal, tr("HEADER4"));
columns->setHeaderData(4, Qt::Horizontal, tr("HEADER5"));
ui->TreeViewA->setModel(columns);

columns->horizontalHeaderItem(0)->setCheckable(true);
columns->horizontalHeaderItem(0)
       ->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
}
つまり、ヘッダーを設定する箇所で同時に、 setCheckable関数 を用いてチェックボックスを設定してしまおうという考えである(12~14行目)

こんなアホらしいミスになんと約一時間程費やしてしまったわけで、なんとも悔しい限りだ(虚

このコードが上手く動いてくれるならば、おそらく horizontalHeaderItem0 が指定されているので、"HEADER1"のカラムの部分にチェックボックスが表示されるという、意味の分からないことになるのだろうが、あいにくカラムの部分にチェックボックスは現れてはくれなかった。

ということで、正しいコードはこちら:
void MainWindow::AddData(void)
{
columns->insertRow(0);
columns->setData(columns->index(0, 0),
QIcon(":/main/main.png"), Qt::DecorationRole);
columns->setData(columns->index(0, 0), tr("COLUMN1"));
columns->setData(columns->index(0, 1), tr("COLUMN2"));
columns->setData(columns->index(0, 2), tr("COLUMN3"));
columns->setData(columns->index(0, 3), tr("COLUMN4"));
columns->setData(columns->index(0, 4), tr("COLUMN5"));

columns->item(0, 0)->setCheckable(true);
columns->item(0, 0)->setCheckState(Qt::Checked);
}
アイテムにチェックボックスを出すには、アイテムをセットするタイミングで、それぞれのアイテムにチェックボックスを設定する必要がある。(12~13行目)

よって、QStandardItemModelのメンバである Item関数 を用いて、設定したいアイテム(列と段)を取得。
そこからさらに QStandardItem のメンバである setCheckable関数 を用いてチェックボックスを設定する、というのが正しい方法というわけだ。

ここまでくれば、あとは setCheckState関数 を用いて、のデフォルトでのチェックの有無を指定することもできる。
また、チェックの有無を確認する関数は isChecked関数 ではなく、checkState関数 である。

なぜ bool型 でチェックの有無を表さないのかというと、どうやらこのチェックボックスにはいわゆる半チェックのようなものがあるらしく、これは setTristate関数 で設定できるらしい(使ったことないから分からないけど)

(参考)Qt Centre : qtreeview + checkboxes