通过调用C ++函数设置加载程序组件

时间:2014-12-24 15:46:11

标签: c++ qt qml

我只是想知道这样的事情是否可行:

Loader {
    id: loader
    objectName: "loader"
    anchors.centerIn: parent

    sourceComponent: cppWrapper.getCurrentDisplay();
 }

在C ++中:

QDeclarativeComponent currentDisplay;

Q_INVOKABLE QDeclarativeComponent getCurrentDisplay() const
{ return currentDisplay; }

我无法编译它(它在moc文件编译中失败),但如果可能,它可能是我真正的快捷方式

1 个答案:

答案 0 :(得分:5)

当然,您可以在C ++部分创建Component(作为QQmlComponent)并将其返回到QML部分。 简单的例子(我使用Qt 5.4):

首先,我创建了一个类,将其用作单例(只是为了方便使用)

<强> COMMON.H

#include <QObject>
#include <QQmlComponent>

class Common : public QObject
{
    Q_OBJECT
public:
    explicit Common(QObject *parent = 0);
    ~Common();
    Q_INVOKABLE QQmlComponent *getComponent(QObject *parent);
};

<强> common.cpp

QQmlComponent *Common::getComponent(QObject *parent) {
    QQmlEngine *engine = qmlEngine(parent);
    if(engine) {
        QQmlComponent *component = new QQmlComponent(engine, QUrl("qrc:/Test.qml"));
        return component;
    }
    return NULL;
}

现在我创建并注册我的单身人士:

<强>的main.cpp

#include "common.h"

static QObject *qobject_singletontype_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
{
    Q_UNUSED(engine)
    Q_UNUSED(scriptEngine)
    static Common *common = new Common();
    return common;
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
        qmlRegisterSingletonType<Common>("Test", 1, 0, "Common", qobject_singletontype_provider);
        QQmlApplicationEngine engine;
        engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
        return app.exec();
}

好的,现在我们有一个单例,在QML中使用它非常简单:

<强> main.qml

import QtQuick 2.3
import Test 1.0

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")
    id: mainWindow

    Loader {
        id: loader
        objectName: "loader"
        anchors.centerIn: parent
        sourceComponent: Common.getComponent(mainWindow)
    }
}

我们用C ++创建的组件:

<强> Test.qml

import QtQuick 2.3

Rectangle {
    width: 100
    height: 100
    color: "green"
    border.color: "yellow"
    border.width: 3
    radius: 10
}

注意:我们所有的QML文件都在资源中,但它只是例如你可以把它放在你想要的任何地方