Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将QML链接到C++;-还是我应该?_C++_Qt_Qml - Fatal编程技术网

C++ 将QML链接到C++;-还是我应该?

C++ 将QML链接到C++;-还是我应该?,c++,qt,qml,C++,Qt,Qml,我正在用Qt创建我的第一个程序(正如SO成员在前面的问题中推荐的那样)。在其文档中,Qt社区鼓励使用QML作为标记语言和JavaScript来处理逻辑。听起来很有希望,但是DOC缺少一个初学者如何解释和如何在何时与C++结合。 从: 使用C++访问和操作QML对象是可能的 深入到对象树中,我们建议您不要使用此选项 应用程序测试和原型之外的方法 假设我们有一个QtQuick2ApplicationViewer对象作为主视图,由默认的Qt创建者模板生成。首先,我想显示一个欢迎屏幕,我为它创建了wel

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

使用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"));
你必须这样做

view.setSource(QUrl("main.qml"));
这里main.qml是一个qml文件,负责加载不同的qml文件。首先,它将加载“welcome.qml”,您需要在main.qml中使用它来加载不同的qml文件

这样做的目的是让*welcome.qml*在接收到哪个main.qml将加载app.qml时发出一个信号,比如showAppPage()。下面是一个简单的例子,也是这样做的

//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在您的案例中起到了作用。我希望这能回答你的问题

你好,罗伯特

如果我是对的,您想知道如何从一个屏幕导航到另一个屏幕。示例:从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文件

这样做的目的是让*welcome.qml*在接收到哪个main.qml将加载app.qml时发出一个信号,比如showAppPage()。下面是一个简单的例子,也是这样做的

//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函数绑定到该控件的信号(例如,
onClicked
)@W.B.谢谢-我想知道,这是否意味着