Question

I have a problem with QQuickView instantiating components from C++... Here is my code:

Class definition (vviewerqml.h):

class VViewerQml : public QObject
{
    Q_OBJECT

public:
    explicit VViewerQml(QSettings &systemSettings, QObject *parent = 0);
    ~VViewerQml();

protected slots:
    void onViewStatusChanged(QQuickView::Status status);

protected:
    QString _qmlFolder;
    QQuickView _view;
};

Class implementation (vviewerqml.cpp):

#include "vviewerqml.h"

VViewerQml::VViewerQml(QSettings &systemSettings, QObject *parent) :
    QObject(parent)
{
    // Initialize viewer reading from settings file
    _qmlFolder = "/my/path/to/qml/files";

    // Initialize the source
    connect(&_view, SIGNAL(statusChanged(QQuickView::Status)),
        this, SLOT(onViewStatusChanged(QQuickView::Status)));

    _view.setSource(QUrl::fromLocalFile(QDir(_qmlFolder).filePath("Main.qml")));

    // Show the viewer
    _view.show();
}

VViewerQml::~VViewerQml()
{
    // Close the viewer
    _view.close();
}

void VViewerQml::onViewStatusChanged(QQuickView::Status status)
{
    if(status == QQuickView::Ready)
    {
        QQmlComponent *c =
            new QQmlComponent(_view.engine(),
            QDir(_qmlFolder).filePath("TextLegacy.qml"));

        QQuickItem *i = qobject_cast<QQuickItem*>(c->create());
        QQmlEngine::setObjectOwnership(i, QQmlEngine::CppOwnership);
        i->setParent(_view.rootObject());
        i->setVisible(true);
    }
}

Here is my Main.qml:

import QtQuick 2.0

Rectangle {
    width: 1024
    height: 768
    color: "#000000"

    Text {
        x: 0
        y: 0
        color: "#ffffff"
        text: "Main page"
    }
}

And here is my TextLegacy.qml:

import QtQuick 2.0

Item {
    Rectangle {
        x: 0
        y: 0
        width: 100
        height: 50
        color: "#ff0000"
    }
}

My code works fine until the load of Main.qml: the QML viewer opens on the screen and I can read the text "Main page" (white on black) on my screen... But unluckily I am not able to load the TextLegacy.qml... if I put a breakpoint in onViewStatusChanged function, the execution reaches that point... no visible errors are shown in the debug console... but I am not able to see on the screen the red rectangle provided by TextLegacy.qml...

What am I missing? Can somebody give some help?

Was it helpful?

Solution

Ok, I found the solution on my own: I have confused setParent with setParentItem... The correct code is:

void VViewerQml::onViewStatusChanged(QQuickView::Status status)
{
    if(status == QQuickView::Ready)
    {
        QQmlComponent *c = new QQmlComponent(_view.engine(),
            QUrl::fromLocalFile(QDir(_qmlFolder).filePath("TextLegacy.qml")));
        QQuickItem *i = qobject_cast<QQuickItem*>(c->create());
        QQmlEngine::setObjectOwnership(i, QQmlEngine::CppOwnership);
        i->setParent(this);
        i->setVisible(true);
        i->setParentItem(_view.rootObject());
    }
}

Actually i->setParent(this); defines the parent of i as a QObject (for deleting purposes, for example) while i->setParentItem(_view.rootObject()); actually adds the object to the scene, as a child of the scene root object.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top