C++ 将QML链接到C++;-还是我应该?
我正在用Qt创建我的第一个程序(正如SO成员在前面的问题中推荐的那样)。在其文档中,Qt社区鼓励使用QML作为标记语言和JavaScript来处理逻辑。听起来很有希望,但是DOC缺少一个初学者如何解释和如何在何时与C++结合。 从:C++ 将QML链接到C++;-还是我应该?,c++,qt,qml,C++,Qt,Qml,我正在用Qt创建我的第一个程序(正如SO成员在前面的问题中推荐的那样)。在其文档中,Qt社区鼓励使用QML作为标记语言和JavaScript来处理逻辑。听起来很有希望,但是DOC缺少一个初学者如何解释和如何在何时与C++结合。 从: 使用C++访问和操作QML对象是可能的 深入到对象树中,我们建议您不要使用此选项 应用程序测试和原型之外的方法 假设我们有一个QtQuick2ApplicationViewer对象作为主视图,由默认的Qt创建者模板生成。首先,我想显示一个欢迎屏幕,我为它创建了wel
使用C++访问和操作QML对象是可能的 深入到对象树中,我们建议您不要使用此选项 应用程序测试和原型之外的方法
假设我们有一个QtQuick2ApplicationViewer
对象作为主视图,由默认的Qt创建者模板生成。首先,我想显示一个欢迎屏幕,我为它创建了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将如何与要加载的app.qml
视图通信?更重要的是:是否应该这样做?一般来说,线条的位置取决于绘制位置:)大多数应用程序可以分为核心模型、一些视图模型和一些视图。viewmodels调整模型的数据以进行显示/编辑
如果要为应用程序实现基于QWidget的GUI,您可能会发现一些viewmodel功能可以在Qt Quick 2 GUI和Qt Widgets GUI之间共享。这并不意味着VIEW模型的实现需要C++,一点也不。
QML完全不依赖GUI。您可以在QML中编写代码,并且仍然使用QWidgets来实际显示内容。请注意,QtQuick2只是一组可以从QML使用的组件,但QML本身是一个根本不了解GUI的底层平台。它可以在纯文本甚至纯服务器应用程序中使用
如果您将一些viewmodel功能考虑到GUI无关的QML中,您当然可以从Qt Quick 2和Qt小部件将其连接起来-即使它是用Javascript完成的。一般来说,线条的位置取决于您绘制它的位置:)大多数应用程序可以分为核心模型、一些viewmodels和一些视图。viewmodels调整模型的数据以进行显示/编辑 如果要为应用程序实现基于QWidget的GUI,您可能会发现一些viewmodel功能可以在Qt Quick 2 GUI和Qt Widgets GUI之间共享。这并不意味着VIEW模型的实现需要C++,一点也不。 QML完全不依赖GUI。您可以在QML中编写代码,并且仍然使用QWidgets来实际显示内容。请注意,QtQuick2只是一组可以从QML使用的组件,但QML本身是一个根本不了解GUI的底层平台。它可以在纯文本甚至纯服务器应用程序中使用 如果您将一些viewmodel功能考虑到GUI无关的QML中,您当然可以从Qt Quick 2和Qt小部件将其连接起来,即使它是在Javascript中完成的。Hi Robbert 如果我是对的,您想知道如何从一个屏幕导航到另一个屏幕。示例:从welcome.qml到app.qml 现在来回答你的问题。。。 JavaScript将如何与要加载app.qml的视图通信?更重要的是:应该吗
从qML方面,可以与C++本地通信,并生成“视图”加载APP.QML。完全可能 更重要的是:应该吗没有必要。您可以加载不同的qml文件,而无需传递“视图”,您需要稍微调整代码。而不是这样做你必须这样做view.setSource(QUrl("welcome.qml"));
这里main.qml是一个qml文件,负责加载不同的qml文件。首先,它将加载“welcome.qml”,您需要在main.qml中使用它来加载不同的qml文件 这样做的目的是让*welcome.qml*在接收到哪个main.qml将加载app.qml时发出一个信号,比如showAppPage()。下面是一个简单的例子,也是这样做的view.setSource(QUrl("main.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() } }
您还可以从main.qml加载welcome.qml和app.qml,而无需使用Loader和Qt.createComponent方法。但QML Loader在您的案例中起到了作用。我希望这能回答你的问题 你好,罗伯特 如果我是对的,您想知道如何从一个屏幕导航到另一个屏幕。示例:从welcome.qml到app.qml 现在来回答你的问题。。。 JavaScript将如何与要加载app.qml的视图通信?更重要的是:应该吗//app.qml import QtQuick 2.1 Rectangle { width: 360 height: 360 color:"red" }
从qML方面,可以与C++本地通信,并生成“视图”加载APP.QML。完全可能 更重要的是:应该吗没有必要。您可以加载不同的qml文件,而无需传递“视图”,您需要稍微调整代码。而不是这样做你必须这样做view.setSource(QUrl("welcome.qml"));
这里main.qml是一个qml文件,负责加载不同的qml文件。首先,它将加载“welcome.qml”,您需要在main.qml中使用它来加载不同的qml文件 这样做的目的是让*welcome.qml*在接收到哪个main.qml将加载app.qml时发出一个信号,比如showAppPage()。下面是一个简单的例子,也是这样做的view.setSource(QUrl("main.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" }
您还可以从main.qml加载welcome.qml和app.qml,而无需使用Loader和Qt.createComponent方法。但QML Loader在您的案例中起到了作用。我希望这能回答你的问题 您必须在QML中导入JavaScript文件。然后在一个QML控件或区域中,您必须将JavaScript函数绑定到该控件的信号(例如,)@W.B.谢谢-我想知道,这是否意味着onClicked