如何监听QQuickItem childItem的添加

时间:2018-02-16 10:59:23

标签: qt qml qtquick2

我创建了带有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)

2 个答案:

答案 0 :(得分:0)

使用QML,您拥有Item属性datachildrenresources

  

children属性包含此视觉子项的列表   项目。 resources属性包含您的非可视资源   想通过名字来引用   [...]默认数据属性将   自动将子对象分配给子项和资源   适当的属性。

当您添加一些Item作为对象的子项时:
myItem->setParentItem(parentQQuickItem);
您可以收听QML代码中的更改:

MyParentItem
{
    onDataChanged:
    {
        // Parse children and modify them
    }
}

或仅将onChildrenChanged用于视觉项目,或仅用onResourcesChanged用于非视觉项目。

答案 1 :(得分:0)

不幸的是,目前没有办法做到这一点。您可以投票支持并观看此建议,以便在实施时收到通知:

https://bugreports.qt.io/browse/QTBUG-74320