私のqtコードで何か間違ったことをしたかどうかはわかりません。itemChanged
アイテムデータが変更されるたびにシグナルが発行される必要があります。次のコードを使用してモデルを作成します。
QStandardItemModel* model = new QStandardItemModel;
QStandardItem *parentItem = model->invisibleRootItem();
QList<QStandardItem*> itemList1;
QList<QStandardItem*> itemList2;
QList<QStandardItem*> itemList3;
QStandardItem* item1;
QStandardItem* item2;
QStandardItem* item3;
for (int i = 0; i < 3; ++i)
{
item1 = new QStandardItem;
item1->setText("item1-" + QString::number(i));
for (int i = 0; i < 3; ++i)
{
item2 = new QStandardItem;
item2->setText("item2-" + QString::number(i));
for (int i = 0; i < 3; ++i)
{
item3 = new QStandardItem;
item3->setText("item3-" + QString::number(i));
itemList3 << item3;
}
item2->appendRows(itemList3);
itemList3.clear();
itemList2 << item2;
}
item1->appendRows(itemList2);
itemList2.clear();
itemList1 << item1;
}
parentItem->appendRows(itemList1);
itemList1.clear();
ui.treeView->setModel(model);
QObject::connect(model, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(onChanged(QStandardItem*)));
onChanged
そして、アイテムが変更されるたびに呼び出されるようにしたいです-たとえば、アイテムのテキストが編集されたり、チェックボックスがクリックされたりします。しかし、いずれの場合もitemChanged
、item2/3 レベルのアイテムではなく、"item1-..." レベルのアイテム (第 1 レベルのアイテム) でのみシグナルをトリガーしました。なんで?そして、どうすればそれを正しくすることができますか?
PS: QTreeWidget を使用した同じコードは完全に機能しますが、アプリでマルチスレッドを使用しているため、モデルとビューを分割する必要があります。QTreeWidget アイテムは非 GUI スレッドで作成できず、qtreewidget は自己作成モデルを使用できません。これが、QStandardItem で QTreeView を使用しなければならない理由です。