我已经创建了带有qml附加属性的c++类,以便在QML中使用它。
现在,我想将附加属性添加到一个QQuickItem对象,并将此附加属性传播到所有QQuickItem子项(由QQuickItem::childItems()返回的子项,而不是由QObject::children()返回的子项)。我可以很容易地遍历现有的QQuickItem子项并向它们添加附加属性,但是我不知道如何侦听某些QQuickItem的添加/删除子项。没有信号,没有事件,只有重写QQuickItem::itemChange()方法。
如何监听添加/删除QQuickItem项的子项?我只找到了QQuickItemChangeListener,但这个类来自于私有API。
UPD1: attached属性的实现:
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)发布于 2018-02-16 19:34:29
使用QML,您可以拥有Item属性data、children和resources:
子项属性包含该项的可视子项的列表。resources属性包含要按名称引用的非可视资源。
..。默认数据属性将根据需要自动将子对象分配子对象和资源属性。
当您添加一些Item作为对象的子级时:
myItem->setParentItem(parentQQuickItem);
您可以监听QML代码中的更改:
MyParentItem
{
onDataChanged:
{
// Parse children and modify them
}
}或者仅对可视项使用onChildrenChanged,或仅对非可视项使用onResourcesChanged。
发布于 2021-07-18 23:42:53
不幸的是,目前还没有办法做到这一点。你可以投票支持并观看这个建议,当它被实施时会收到通知:
https://stackoverflow.com/questions/48825319
复制相似问题