QtQuick:从 C++ 创建组件

Mor*_*Dev 1 c++ qt qt-quick qt5 qtquick2

我有 QQuickView 从 C++ 实例化组件的问题......这是我的代码:

类定义 ( 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;
};
Run Code Online (Sandbox Code Playgroud)

类实现(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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的Main.qml

import QtQuick 2.0

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

    Text {
        x: 0
        y: 0
        color: "#ffffff"
        text: "Main page"
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的TextLegacy.qml

import QtQuick 2.0

Item {
    Rectangle {
        x: 0
        y: 0
        width: 100
        height: 50
        color: "#ff0000"
    }
}
Run Code Online (Sandbox Code Playgroud)

我的代码工作正常,直到加载Main.qml:QML 查看器在屏幕上打开,我可以在我的屏幕上阅读文本“主页”(黑底白字)......但不幸的是我无法加载TextLegacy.qml......如果我在onViewStatusChanged函数中放置了一个断点,执行到了那个点......调试控制台中没有显示任何可见的错误......但我无法在屏幕上看到TextLegacy.qml......提供的红色矩形

我错过了什么?有人可以提供一些帮助吗?

Mor*_*Dev 5

好的,我自己找到了解决方案:我混淆setParentsetParentItem......正确的代码是:

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

实际上i->setParent(this);将 的父对象定义i为 a QObject(例如,出于删除目的),而i->setParentItem(_view.rootObject());实际上将对象添加到场景中,作为场景根对象的子对象。