将QML链接到C ++ - 或者我应该?

时间:2014-03-22 12:22:49

标签: c++ qt qml

我用Qt创建了我的第一个程序(正如SO成员在之前的一个问题中所推荐的那样)。在其文档中,Qt社区鼓励使用QML作为标记语言和JavaScript来处理逻辑。听起来很有希望,但是文档缺乏一个很好的初学者解释,说明这两者如何以及何时与C ++结合。

来自Qt 5 docs

  

虽然可以使用C ++来访问和操作QML对象   深入到对象树中,我们建议您不要这样做   在应用程序测试和原型设计之外的方法。

假设我们有一个QtQuick2ApplicationViewer对象作为我们的主视图,由默认的Qt Creator模板生成。首先,我想展示一个我已创建的欢迎屏幕welcome.qml。当用户单击按钮时,主程序运行,即app.qml。根据我收集的内容,我的main函数应该如下所示:

QGuiApplication app(argc, argv);

QtQuick2ApplicationViewer view; // Class generated by the default template.
view.setSource(QUrl("welcome.qml")); // Load QML.
view.showExpanded();

return app.exec();

像魅力一样工作。根据文档,我现在应该有一个welcome.js文件来处理关闭欢迎屏幕。现在我很困惑 - JavaScript如何与view的{​​{1}}进行通信?更重要的是:应该吗?

2 个答案:

答案 0 :(得分:3)

你好Robbert,

如果我是对的,您想知道如何从一个屏幕导航到另一个屏幕。示例:从 welcome.qml app.qml

现在回答你的问题......   JavaScript将如何回传到要加载app.qml的视图?更重要的是:应该吗?

从QML方面,您可以与C ++本机端进行通信,并使' 查看'加载 app.qml 。完全可能。

更重要的是:它应该吗?:没必要。您可以加载不同的qml文件而无需通信' 查看'你需要稍微调整你的代码。而不是这样做..

 view.setSource(QUrl("welcome.qml"));

你必须这样做..

view.setSource(QUrl("main.qml"));

此处 main.qml 是一个qml文件,负责加载不同的qml文件。首先,它会加载' welcome.qml '您需要在main.qml中使用QML Loader来加载不同的qml文件。

我们的想法是让* welcome.qml *发出一个信号,比如showAppPage()接收哪个 main.qml 将加载 app.qml 。以下是一个相同的简单示例。

//Main.qml
import QtQuick 2.1
Item {
    width: 360
    height: 360
    Loader{
        id:pageLoader
        source: "welcome.qml"
    }
    Connections{
        target: pageLoader.item
        onShowAppPage:{
            pageLoader.source = "app.qml"
        }
    }
}

欢迎页面

//welcome.qml
import QtQuick 2.1

Rectangle {
    width: 360
    height: 360
    color:"blue"
    signal showAppPage;
    MouseArea{
        anchors.fill: parent
        onClicked: showAppPage()
    }
}

应用页面

//app.qml
import QtQuick 2.1

Rectangle {
    width: 360
    height: 360
    color:"red"
}

您也可以在不使用Loader并使用Qt.createComponent方法的情况下从main.qml加载welcome.qml和app.qml。但是QML Loader可以满足您的需求。我希望这回答了你的问题。

答案 1 :(得分:1)

一般来说,行的位置取决于你绘制它的位置:)大多数应用程序可以分为核心模型,一些视图模型和一些视图。视图模型调整模型的数据以进行显示/编辑。

如果要为应用程序实现基于QWidget的GUI,您可能会发现Qt Quick 2 GUI和Qt Widgets GUI之间可以共享一些viewmodel功能。这个意味着viewmodel实现需要在C ++中,而不是。

QML完全与GUI无关。您可以使用QML进行编码,并仍然使用QWidgets来实际显示内容。请注意,Qt Quick 2只是一组可以在QML中使用的组件,但QML本身是一个根本不了解GUI的底层平台。它可以在纯文本或甚至仅服务器应用程序中使用

如果您将某些viewmodel功能纳入与GUI无关的QML中,您当然可以将它与Qt Quick 2和Qt Widgets联系起来 - 即使它是在Javascript中完成的。