我用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}}进行通信?更重要的是:应该吗?
答案 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中完成的。