gpt4 book ai didi

c++ - 带有 QTreeView 模型的 Qt itemChanged 信号仅适用于第一级项目

转载 作者:太空狗 更新时间:2023-10-29 20:54:52 25 4
gpt4 key购买 nike

不知道是不是我的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 - 例如,编辑项目文本或单击复选框。但在每种情况下,我都只在“item1-...”级项目(第一级项目)上触发了 itemChanged 信号,而不是在 item2/3 级项目上。为什么?我怎样才能使它正确?

PS:与 QTreeWidget 相同的代码工作完美,但我在我的应用程序中使用多线程,我需要划分模型和 View 。 QTreeWidget 项目不能在非gui 线程中创建,qtreewidget 不能使用自创建模型。这就是为什么我必须将 QTreeView 与 QStandardItem 一起使用的原因。

最佳答案

我刚刚调试了下,你没有得到信号的原因如下:当item的数据改变时,你在Qt源码中是这样的:

void QStandardItem::setData(...)
{
/* ... */
if (d->model)
d->model->d_func()->itemChanged(this);
}

另一方面,将子项添加到父项时,您有

bool QStandardItemPrivate::insertRows(int row, const QList<QStandardItem*> &items)
{
/* ... */
for (int i = 0; i < items.count(); ++i) {
/* ... */
item->d_func()->model = model;
}
}

所以这意味着,项目需要一个指向模型的指针来通知模型有关更改的信息,并且子项目的模型在插入时设置为父项目。现在您首先将 child 添加到父项,然后将 parent 添加到他们的父项,将不可见的根作为一级项目的父项。由于无形根有模型,因此 1 级项目发送信号,但其他项目没有。

一个简单的更改解决了这个问题:只需先将项目添加到其父项,然后附加子项,如下所示:

for (int i = 0; i < 3; ++i)
{
item1 = new QStandardItem;
item1->setText("item1-" + QString::number(i));
parentItem->appendRow(item1);

for (int i = 0; i < 3; ++i)
{
item2 = new QStandardItem;
item2->setText("item2-" + QString::number(i));
item1->appendRow(item2);

for (int i = 0; i < 3; ++i)
{
item3 = new QStandardItem;
item3->setText("item3-" + QString::number(i));
item2->appendRow(item3);
}
}
}

关于c++ - 带有 QTreeView 模型的 Qt itemChanged 信号仅适用于第一级项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37779239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com