如何通过q​​ml

时间:2016-09-28 20:47:30

标签: javascript qt qml

我有一个由几个QWidgets组成的项目,每个QWidgets都有自己的qml文件。每个qml文件都使用一些变量导入相同的Global.js文件(例如var xyz = 1)。现在,我想通过我的c ++代码更改这个javascript变量。

Global.js:

.pragma library
var xyz = 300;

my.qml:

import "Global.js" as Global

Rectangle {
    property int m_heigth
    width: Global.xyz
    heigth: m_heigth
}

C ++:

this->setProperty("m_heigth", 300);   // <--- does work
this->setProperty("Global.xyz", 300); // <--- does not work :(

如何在C ++中访问此javascript变量?

2 个答案:

答案 0 :(得分:0)

您可以在C++中构建对象,使用QObjectQ_PROPERTY中要访问的每个元素继承QML

然后,您使用QML将此对象显示为QQmlContext::setContextProperty()

例如,假设GlobalsC++对象的类型,您的main()方法可能如下所示:

int main(int argc, char *argv[]) {
    QGuiApplication app(argc, argv);
    QQmlApplicationEngine engine;

    engine.rootContext() -> setContextProperty("globals", new Globals);
    engine.load(QUrl(QLatin1String("qrc:/qml/main.qml")));
    return app.exec();
}

现在从main.qml开始,您可以访问以下任何属性:

Text {
    text: qsTr("Test")
    color: globals.myFavouriteColour
}

答案 1 :(得分:0)

我建议通过让C ++对象将各自的变量作为属性,通过setContextProperty()公开它,然后在Global.js

中访问该对象来做到这一点

在C ++中使用全局状态通常是一个好主意,因为它甚至可以在重新加载QML内容后继续存在,这对于快速开发非常有用,等等。

C ++对象只需要从QObject派生,并使用Qt s Q_PROPERTY`机制,大致类似于此

class MyGlobal : public QObject
{
    Q_OBJECT
    Q_PROPERTY(int xyz MEMBER m_xyz NOTIFY xyzChanged)

signals:
    void xyzChanged();

private:
    int m_xyz;
};

Expsoing对象看起来像这样

// assuming a QQmlEngine named engine, e.g. from a QQuickView or a QQmlApplicationEngine
MyGlobal global;
engine->rootContext()->setContextProperty("_global", &global);

然后可以在QML中访问该对象,就好像它是一个标识为_global的QML元素,例如var xyz = _global.xyzwidth: _global.xyz