QML C++应用程序中,反之亦然

QML in C++ app or vice versa

本文关键字:反之亦然 应用程序 C++ QML      更新时间:2023-10-16

考虑一个简单的GUI显示相当复杂的计算输出的情况。

现在我想使用 QML 编写一个漂亮的自定义 GUI。
我还想用 QT C++ 编写我的后台应用程序。

我坐在QT文档前,想知道
如果我1(应该编写一个QML应用程序并以某种方式将我的C++类嵌入其中(这是绝对可能的(或者如果我
2(应该写一个C++的应用程序并以某种方式将 QML GUI 嵌入其中并从我的类中修改 QML 属性(这又是可能的(

我已经使用 GUI 的 QT 小部件编写了C++的所有内容。我只想将 GUI 移动到 QML 并保留C++类,即使我愿意将接口重写为 GUI。

可能的安瑟:

下面标记的解决方案建议保留C++类,并仅通过信号和插槽与GUI接口。所以基本上我最终得到了一个main.cpp它实例化了我的主要工作类并像这样显示QML GUI:

QQuickView viewer;
viewer.setSource(QUrl("./qml/main.qml"));
viewer.show();

然后我添加了myClass并得到了一个对象来做连接:

MyClass myClass;
QQuickItem* item = viewer.rootObject();
QObject::connect(item, SIGNAL(buttonClicked()), &myClass, SLOT(mySlot()));
QObject::connect(&myClass, SIGNAL(mySignal(QVariant)), item, SLOT(updateGUI(QVariant)));

在C++类中实现时隙和信号时,必须使用 QVariant 对象来传输数据。然后,QML文件实现信号,例如用于单击的按钮和插槽以接收要显示的数据。

这正是我所希望的。对我的非GUI代码的唯一更改是通过信号和插槽进行所有交互。现在我甚至可以为我的应用程序使用两个GUI(QML/小部件(。

只需用C++编写核心逻辑,将其与信号和插槽接口,您就可以将同一组件与小部件和 QML 一起使用。

这不是火箭科学,C++逻辑允许与C++和QML,JS逻辑一起使用 - 只有QML。C++和Qt API是更合理的解决方案,因为从JS中你实际上无法访问Qt API的那么多功能,只有少数方法被"移植"到QML世界中。但是所有高性能数据容器和执行性能本身都是C++。

如果你只需要显示结果,而控制台还不够好,我宁愿保留QtWidgets,因为添加声明性模块会大大减慢编译速度。widget 模块现在是独立的,所以即使使用 QtWidgets(在 Qt4 中它是 QtGui 的一部分(,你也会添加"额外"模块,但它更轻。使用小部件对核心逻辑进行原型设计后,您可以实现一个 QML 接口,并将其连接到现有的信号/插槽/属性和使用它们的绑定。

不,您不会将 QML 嵌入C++类中,而是相反,C++是用于创建 QML 组件的更底层的层。至于实际的实例化,你可以双向进行 - 如果你将一个基于QObject的类注册到 QML 引擎,你可以在 QML 中实例化它。或者你可以在C++中实例化类,并且只让它在 QML 上下文中可用 - 这并不重要。如果您需要单个对象,最好在 main() 函数中以C++形式实例化它,并使其在 QML 上下文中可用,如果它是您打算大量实例化的组件 - 然后创建一个 QML 组件。

您可以在 QML 中使用 JS 对核心逻辑进行原型设计,然后根据需要将其移植到 C++。它看起来像是两倍的努力,但如果你把你的床铺对了,它实际上是一个生产力的提高,因为在 QML 中原型设计要快得多,捕获错误更安全且信息丰富得多,如果你的 API 做得好,将 JS 代码移植到 C++ 通常是一个小麻烦 - 用具体类型替换一些var, 用->之类的东西替换一些.

任何你真正想最终在C++中完成的"精心计算"。每次计算完成后,您都可以简单地将其作为信号发射,并自动将结果显示到信号连接的任何插槽,无论是在小部件中还是在 QML 中,甚至同时在两者中。

这是非常基于意见的。不可能有"正确"的答案。对我来说,用QML编写并使用Qt插件"扩展"qml"更容易"。那是因为我以这种方式做了一个大项目。其他人可能有其他经验,并可能因此而采取不同的方法。我们的"生活故事"都不能帮到你。