10

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

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

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

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

可能的分析器:

下面标记的解决方案建议保留 C++ 类并专门通过 SIGNALS 和 SLOTS 接口 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 文件实现 SIGNALS,例如用于单击按钮和 SLOTS 以接收要显示的数据。

这正是我所希望的。对我的非 GUI 代码的唯一更改是通过 SIGNALS 和 SLOTS 进行所有交互。现在我什至可以在我的应用程序中使用这两种 GUI(QML / Widgets)。

4

2 回答 2

8

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

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

如果只需要显示结果而控制台不够好,我宁愿继续使用 QtWidgets,因为添加声明性模块会显着减慢编译速度。小部件模块现在是独立的,因此即使使用 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用具体类型替换一些 s,用.类似->的东西替换一些。

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

于 2013-08-13T09:48:32.787 回答
0

这是非常基于意见的。不可能有“真实”的答案。对我来说,用 QML 编写和使用 Qt 插件“扩展” qml 会“更容易”。那是因为我用这种方式做了一个大项目。其他人可能有其他经历,并且可能因此喜欢不同的方法。我们的“生活故事”对您没有多大帮助。

于 2013-08-13T09:32:13.073 回答