QML没有从c++属性中注册属性更改
QML not registering property change from C++ property
我正在显示来自自定义QAbstractListItem
子类(在这里实现)的GridView
中的数据。添加和删除项目工作正常,QML通知更改和转换工作正常。
现在我试图在模型中设置一个Item的属性,并让QML对其进行反应。问题是,QML内部的onPropertyChanged
没有被调用。
// 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
这里出了两个问题。首先,因为
上的++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);
我的错误。
但另一方面,由于rolename索引似乎是平台相关的,并且从模型发出更改信号是一种不太好的方法,因此更好的解决方案(如Kevin Krammer所建议的)是重写itemmodel,使其只包含单个属性,即QObject
项。这样QML 就会被通知条目属性所发生的更改。
相关文章:
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 无法将结构注册为增强几何体3D点
- C++概念:如何使用'concept'检查模板化结构的属性?
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 通过指向指针数组的指针访问子类的属性
- 如何使用AngelScript注册SFML Vector2运算符
- MSVC是否支持C++11样式的属性而不是__declspec
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 类的C++属性似乎已重新初始化
- Qt Quick-如何仅从c++代码与qml属性交互
- 在遍历处理程序的向量时注册和注销处理程序
- 有没有任务栏API可以立即应用注册表更改
- 使用QJsEngine在Qt中注册自定义类型
- 用概念检查属性的类型
- C++如何将同一类的实例作为属性
- 检查注册表项是否链接到(或副本)另一个注册表项
- 按多个属性排序
- 如何使用 TStyleManager::UnRegisterStyle() 取消注册样式
- 主函数参数的属性
- QML没有从c++属性中注册属性更改