QML C++应用程序中,反之亦然
QML in C++ app or vice versa
考虑一个简单的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"更容易"。那是因为我以这种方式做了一个大项目。其他人可能有其他经验,并可能因此而采取不同的方法。我们的"生活故事"都不能帮到你。
- 试图在visual studio上用C++创建一个桌面应用程序
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 在C应用程序中运行C++(带有STL)函数
- 使用VerQueryValue检索应用程序的文件描述
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 使用调试/崩溃报告将应用程序部署到客户端
- C++控制台应用程序阻止退出
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 将应用程序从32位移植到64位时出现问题
- 如何改变c++应用程序的视觉效果
- WM_CTLCOLORSTATIC从未在WIN32应用程序中触发
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 示例外壳应用程序显示的 V8 "segmentation fault (core dumped)"错误
- phytec phyBOARD iMX-6在从闪存而不是SD卡运行qt5 opengles应用程序时表现不佳(FPS减半
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 如何从Windows应用程序输出到标准?
- C++应用程序 MySQL odbc 数据库连接错误:在引发"otl_tmpl_exception<>"实例后终止调用
- 如何在 64 位 vb.net Windows 应用程序中引用 32 位 dll
- QML C++应用程序中,反之亦然