从C ++访问动态创建的QML对象

时间:2017-02-16 10:14:23

标签: c++ qt qml

我有一个QML对象,可以在其中创建相同的对象。函数addChildRect是从C ++调用的。每个对象都具有唯一的idobjectName(对于每个对象,它们都是相同的)。我希望使用QObject::findChild从C ++访问它们,但对于动态创建的对象,此函数始终返回空指针。我的建议是,这个函数只解析最初在QML中的对象。如何从C ++访问动态创建的对象?

Rect.qml

Rectangle {
    color: "red"
    function addChildRect(id,x,y,width,height)
    {
        var component;
        component = Qt.createComponent("Rect.qml");
        component.createObject(this, {
                               id:id,
                               objectName:id,
                               x:x,
                               y:y,
                               width:width,
                               height:height});
    }
}

C ++代码:

//find element
auto parentRectView = engine.rootObjects().first()->findChild<QObject*>(QString::number(id())); 


//create element
QMetaObject::invokeMethod(parentRectView,"addChildRect",
                          Q_ARG(QVariant,id()),
                          Q_ARG(QVariant,m_position.x()),
                          Q_ARG(QVariant,m_position.y()),
                          Q_ARG(QVariant,m_size.height()),
                          Q_ARG(QVariant,m_size.width()));

1 个答案:

答案 0 :(得分:2)

假设我们有以下QML代码(main.qml):

Window {
    width: 300
    height: 400
    visible: true
    id: window

    Component {
        id: testItem
        Rectangle {
            width: 100
            height: 100
            color: "green"
            anchors.centerIn: parent
        }
    }

    function addItem(name)
    {
        var component = testItem.createObject(window.contentItem, {objectName: name});
        return component;
    }
}

注意 - 作为父母我传递Item,在我的情况下,这是Window.contentItem - 隐藏的根项Window,因为Window不是Item。 我不是javascript大师,但我认为你在这里使用this是指向函数的指针,而不是Item

好的,这是一个C ++代码:

QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
QObject *item = dynamic_cast<QObject *>(engine.rootObjects().at(0));
QVariant retVal;
QMetaObject::invokeMethod(item, "addItem", Qt::DirectConnection,
                           Q_RETURN_ARG(QVariant, retVal),
                           Q_ARG(QVariant, "test"));

qWarning() << retVal;

在我的情况下,输出将类似于

  

QVariant(QObject *,QQuickRectangle(0x2c125490,name =“test”))

您只需将QVariant投射到QQuickItemQObject

至于找到动态创建的对象,你是对的。例如,以下代码的输出:

QObject *rect = qvariant_cast<QObject*>(retVal);
qWarning() << rect;
QObject *myitem = item->findChild<QObject *>("test");
qWarning() << myitem;

将是:

QQuickRectangle(0x2c270d38, name = "test") 
QObject(0x0)

findChild虽然设置了parent rect,但仍返回null。 也许有人可以解释这种奇怪的行为。