[英]QML not registering property change from C++ property
我在自定义QAbstractListItem
子类( 此处实现)的GridView
显示数据。 添加和删除项目工作正常,QML会通知更改并且转换工作正常。
现在我正在尝试在模型中设置Item的属性并让QML对其做出反应。 问题是,没有调用QML中的onPropertyChanged
。
这是C ++中的属性:
// item.h
Q_PROPERTY(bool pToBeDeleted READ toBeDeleted NOTIFY toBeDeletedChanged)
// item.cpp
void Item::requestDelete()
{
toBeDeleted_m = true;
qDebug() << "emitting";
emit toBeDeletedChanged();
}
这就是GridView的样子:
// main.qml
GridView {
id: grid
// ...
model: empty
delegate: customComponent {
toBeDeleted: pToBeDeleted
}
ListModel {
id: empty
}
}
程序启动时, grid
model
设置为我的itemmodel。
这是QML类型,看不到变化:
// customComponentForm.ui.qml
Item {
property bool toBeDeleted: false
}
// customComponent.qml
CustomComponentForm {
onToBeDeletedChanged: {
console.debug("change")
}
}
现在,当我从模型内部调用方法时,如下所示:
this->items.at(i++)->requestDelete();
输出显示emitting
但不change
。
我试图包括
emit dataChanged(createIndex(i, 0), createIndex(i, 0));
这确实导致onToBeDeletedChanged
有时被调用,但这也导致了一些错误的行为与错误
DelegateModel::item: index out range 3 3
这里出了两件事。 首先,因为++ at
this->items.at(i++)->requestDelete();
dataChanged
emit具有错误的索引,导致错误的项目被更新。 第二,
emit dataChanged(createIndex(i, 0), createIndex(i, 0));
错过了第三个参数,并且因为在另一次尝试中我尝试以错误的方式内联定义Vector,我没有立即发现这是问题。 这里的正确电话会是
QVector<int> v;
v.append(Qt::UserRole + 7 + 1);
// pToBeDeleted being the 7th property, always check this with
// roleNames()[Qt::UserRole + i + 1]. It should say your property.
emit dataChanged(createIndex(i, 0), createIndex(i, 0), v);
我的错。
但另一方面,由于角色名称索引似乎与平台有关,并且表明模型的变化在某种程度上是一种肮脏的方法,更好的解决方案(如Kevin Krammer所建议的)将重写itemmodel只包含一个属性,这是QObject
项。 这样,QML 就会通知更改项目的属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.