qml从c ++读取变量?

时间:2019-02-10 15:54:44

标签: c++ qt qml

我正在尝试为我的android apk设置applicationwindow {}大小,所以我希望从cpp文件中读取值:

main.cpp:

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

    QScreen *screen = QApplication::screens().at(0);
    QVariant sz_width = screen->availableSize().width();
    QVariant sz_height = screen->availableSize().height();

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();
}

然后从qml文件读取它(main.qml):

ApplicationWindow {
    id: mainWindow
    visible: true
    width: sz_width
    height: sz_height 
}

这是为了稍后在qml中轻松处理所有对象大小,因此,例如,我基本上使用mainWindow * 0.5的字体大小,因此我可以为每个应用程序分辨率使用适当的字体大小,但是只有当我真正使用设置变量的宽度和高度...

也许这种解决方案是一个“病态”的解决方案,但是如果您能以正确的语法帮助我,我想以这种方式进行...

谢谢

1 个答案:

答案 0 :(得分:4)

要在QML中快速显示C ++值,可以将其设置为context property

QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("screenWidth", sz_width);
engine.rootContext()->setContextProperty("screenHeight", sz_height);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

在此之后,变量在QML中通过加引号的名称(“ screenWidth”和“ screenHeight”)可用(如果您愿意,它们也可以与C ++变量名匹配)。

QSize类型也是recognized by QML,因此您可以将大小设置为一个变量。

engine.rootContext()->setContextProperty("screenSize", screen->availableSize());

在这种情况下,您正在寻找的信息也已在QML中可用...检查附加的Screen对象以及Qt.application.screens对象/属性以获取可用屏幕的列表。 / p>

已添加:

由于链接的文档没有直接提及,因此应注意,以这种方式设置的上下文属性变量没有更改通知信号。因此,与其他“可绑定”属性不同,它们不会在QML中自动更新。使QML自动更新值的唯一方法是再次设置context属性(或创建一些QML可以连接并使其重新读取值的信号)。

我找不到Qt文档中确切提到的位置,但是QQmlContext页提供了一个(微妙的)线索:

  

通过调用QQmlContext :: setContextProperty()定义和更新上下文属性。