我只是想知道这样的事情是否可行:
Loader {
id: loader
objectName: "loader"
anchors.centerIn: parent
sourceComponent: cppWrapper.getCurrentDisplay();
}
在C ++中:
QDeclarativeComponent currentDisplay;
和
Q_INVOKABLE QDeclarativeComponent getCurrentDisplay() const
{ return currentDisplay; }
我无法编译它(它在moc文件编译中失败),但如果可能,它可能是我真正的快捷方式
答案 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文件都在资源中,但它只是例如你可以把它放在你想要的任何地方