考虑一个简单的GUI显示相当复杂的计算输出的情况.
现在我想用QML编写一个漂亮的自定义GUI .
我还想在QT C++中编写我的后台应用程序.
我坐在QT文档的前面,想知道我
是否应该编写一个QML应用程序并以某种方式在其中嵌入我的C++类(这是绝对可能的)或者如果我
2)应该编写一个C++应用程序
并以某种方式嵌入QML GUI中的GUI并修改我的类的QML属性(这也是可能的)
我已经使用QT Widgets为GUI编写了C++中的所有内容.我只想将GUI移动到QML并保留C++类,即使我愿意重写GUI的接口.
可能的anser:
下面标记的解决方案建议保留C++类并通过SIGNALS和SLOTS专门连接GUI.所以基本上我最终得到了一个main.cpp,它实例化我的主工作类并显示如下的QML GUI:
QQuickView viewer;
viewer.setSource(QUrl("./qml/main.qml"));
viewer.show();
Run Code Online (Sandbox Code Playgroud)
然后我添加了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)));
Run Code Online (Sandbox Code Playgroud)
在C++类中实现插槽和信号时,必须使用QVariant对象来传输数据.然后,QML文件实现SIGNALS,例如用于单击按钮和SLOTS以接收要显示的数据.
这正是我所希望的.我的非GUI代码的唯一变化是通过SIGNALS和SLOTS进行所有交互.现在我甚至可以为我的应用程序使用两个GUI(QML/Widgets).
只需用C++编写核心逻辑,将其与信号和插槽连接,您就可以将相同的组件与小部件一起使用,也可以与QML一起使用.
它不是火箭科学,C++逻辑允许使用C++和QML,JS逻辑 - 只有QML.C++和Qt API是更合理的解决方案,因为从JS中你实际上无法访问Qt API的那么多功能,只有少数方法被"移植"到QML世界中.但是所有高性能数据容器和执行性能本身都是用C++编写的.
如果你只需要显示结果并且控制台不够好,我宁愿继续使用QtWidgets,因为添加声明性模块会大大减慢编译速度.小部件模块现在是独立的,所以你甚至用QtWidgets添加"额外"模块(在Qt4中它是QtGui的一部分)但它更轻.在使用小部件对核心逻辑进行原型设计之后,您可以实现一个QML接口,并将其连接到现有的信号/插槽/属性和使用它们的绑定.
不,你没有在C++类中嵌入QML,反过来说,C++是更低级的层,用于创建QML组件.至于实际的实例化,你可以双向进行 - 如果你将QObject
基础类注册到QML引擎,你可以用QML实例化它.或者您可以在C++中实例化该类,并且只在QML上下文中使用它 - 这并不重要.如果你需要一个单独的对象,最好在main()
函数中用C++实例化它,并使它在QML上下文中可用,如果它是你打算实例化的组件 - 然后创建一个QML组件.
您可以使用QML中的JS对核心逻辑进行原型设计,然后将其移植到C++中(如果您也需要).这看起来像是两倍的努力,但是如果你让你的床铺正确,它实际上提高了生产率,因为原型设计在QML中要快得多,捕获错误更加安全和信息丰富,如果你做好API,移植JS代码以C++通常是一个小麻烦-替换一些var
与具体类型S,替换一些.
用->
之类的东西.
任何"精心计算"你真的想用C++最终做.每次计算完成后,您只需将其作为信号发出,并自动将结果显示到信号所连接的任何插槽中,即小部件或QML中,或者甚至两者同时显示.
归档时间: |
|
查看次数: |
2288 次 |
最近记录: |