Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

set parent when creating a QML component from C++



  • Hello,

    I've a QML component that is created from C++ code:

    QML Code:

    Rectangle {
            width: parent.width
            y: parent.height / 2
            color: "red"
        }
    

    C++ Code:

        QQmlComponent component(engine, QUrl(src));
        QObject *comp = component.create();
        QQuickItem *item = qobject_cast<QQuickItem*>(comp);
        item->setParentItem(root);
    

    When the component is created appears these errors:

    TypeError: Cannot read property 'height' of null
    TypeError: Cannot read property 'width' of null

    On creation, the parent property is null and not is valid until the item->setParentItem is executed. How can I set the parent item when creating the component? or how to avoid these errors?

    Best regards.



  • There are object cast need to be done for "root" object too

    QQmlComponent component(engine, QUrl(src));
        QObject *comp = component.create();
        QQuickItem *item = qobject_cast<QQuickItem*>(comp);
        item->setParentItem(qobject_cast<QQuickItem*>(root));
    

    This works for me in my project:

    // QtQuick Application
    int main(int Counter, char *Arguments[]) {
    
    	QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    	QGuiApplication Application(Counter, Arguments);
    
    	QQmlApplicationEngine Engine;
    	Engine.load(QUrl(Main));
    	if (Engine.rootObjects().isEmpty()) {
    		return -1;
    	}
    
    	QObject *oRootObject = dynamic_cast<QObject*>(Engine.rootObjects()[0]);
    	QObject *oBottomBlock = oRootObject->findChild<QObject*>("bottomBlock");
    
    	if (oBottomBlock) {
    
    		QQmlComponent oComponent(&Engine,QUrl(QString("qrc:/ButtonExit.qml")));
    		QObject *oButtonExit = oComponent.create();
    		QQuickItem *oItemButtonExit = qobject_cast<QQuickItem*>(oButtonExit);
    		oItemButtonExit->setParentItem(qobject_cast<QQuickItem*>(oBottomBlock));
    	}
    
    	return Application.exec();
    }
    

Log in to reply