我创建了带有QML附加属性的c ++类,以便在qml中使用它。
现在我想将附加属性添加到一个QQuickItem
对象,并为所有QQuickItem
子项(由QQuickItem::childItems()
而不是QObject::children()
返回的子项)传播此附加属性。我可以轻松地遍历现有的QQuickItem
子项并向其添加附加属性,但是我无法了解如何监听某些QQuickItem
的已添加/删除的子项。没有信号,没有事件只覆盖QQuickItem::itemChange()
方法。
如何收听添加/删除QQuickItem
项目的孩子?
我发现只有QQuickItemChangeListener
,但此类来自私有API。
UPD1: 附属物的实施:
class MyProp : public QObject {
Q_OBJECT
Q_PROPERTY(int prop ...)
public:
explicit MyProp(QObject * object = nullptr) : QObject(object) {
auto item = qobject_cast<QQuickItem *>(object);
if(item) {
for(auto child : _item->childItems()) {
QObject * attached = qmlAttachedPropertiesObject<MyProp>(child, true);
... // needs to listen here for adding/removing child items
}
}
}
static MyProp * qmlAttachedProperties(QObject * object) {
return new MyProp(object);
}
}
QML_DECLARE_TYPEINFO(MyProp, QML_HAS_ATTACHED_PROPERTIES)
答案 0 :(得分:0)
使用QML,您拥有Item
属性data
,children
和resources
:
children属性包含此视觉子项的列表 项目。 resources属性包含您的非可视资源 想通过名字来引用 [...]默认数据属性将 自动将子对象分配给子项和资源 适当的属性。
当您添加一些Item
作为对象的子项时:
myItem->setParentItem(parentQQuickItem);
您可以收听QML代码中的更改:
MyParentItem
{
onDataChanged:
{
// Parse children and modify them
}
}
或仅将onChildrenChanged
用于视觉项目,或仅用onResourcesChanged
用于非视觉项目。
答案 1 :(得分:0)
不幸的是,目前没有办法做到这一点。您可以投票支持并观看此建议,以便在实施时收到通知: