• 3986阅读
  • 11回复

[讨论]QML与C++数据交互问题 [复制链接]

上一主题 下一主题
离线cllssg
 

只看楼主 倒序阅读 楼主  发表于: 2019-09-28
小弟刚接触QML,遇到了QML与C++数据交互,向各位高手请教下。
就是在C++进行数值运算,每200ms产生一个结构体数组,实时的让QML在界面进行显示,现在不知道用什么办法实现。
结构体类似
struct Dat
{
double P;
double B;
double E;
}
计算的结构体数组:struct Dat data[15];  所有的数据都放在data[15]里面,
请各位高手能给指导下,谢谢
离线小韩老师

只看该作者 1楼 发表于: 2019-09-28
如果是我的话,我的实现思路是封装一个类,该类继承自QQmlPropertyMap,该类定
一个接收到新数据的signal,每次产生新数据时就发送一个信息,在QML中接收并处理。(由于200ms时间间隔挺大的可以处理过来,15个数据结构数据量不大也可以存贮在QML中)。
离线cllssg

只看该作者 2楼 发表于: 2019-09-28
回 小韩老师 的帖子
小韩老师:如果是我的话,我的实现思路是封装一个类,该类继承自QQmlPropertyMap,该类定
一个接收到新数据的signal,每次产生新数据时就发送一个信息,在QML中接收并处理。(由于200ms时间间隔挺大的可以处理过来,15个数据结构数据量不大也可以存贮在QML中)。 (2019-09-28 08:34) 

我现在纠结的是结构体数组怎么进行传递问题,就是在C++中用什么变量进行传递给QML,毕竟QML不支持结构体类型啊,我本来想用二维数组那,但是弄了半天也不知道咋回事
离线小韩老师

只看该作者 3楼 发表于: 2019-09-28
QML和C++数据交互就是通过数据映射过去的,不要想着在QML中操作结构体等指针玩意。你将结构体中的变量名变为属性名,变量值变为属性值,这不就完成了交互,二该类就是交互的中间人(不管哪个版本QT都可以这么干),比如你的结构中的a,就封装为属性a,将a的值设置给该属性,这不就实现了交互。
离线cllssg

只看该作者 4楼 发表于: 2019-09-28
回 小韩老师 的帖子
小韩老师:QML和C++数据交互就是通过数据映射过去的,不要想着在QML中操作结构体等指针玩意。你将结构体中的变量名变为属性名,变量值变为属性值,这不就完成了交互,二该类就是交互的中间人(不管哪个版本QT都可以这么干),比如你的结构中的a,就封装为属性a,将a的值设置给该属性,这不就 .. (2019-09-28 09:27) 

我倒是明白你的意思,就是把结构体内部的变量作为单一的属性进行注册,然后在QML进行应用。
但是要是结构体比较复杂的话,那就得定义很多的属性,而且结构体数组比较大的话,每个属性得有很多得值。最主要得是结构体数组是实时生成的,就是函数生成返回的就是个结构体数组,要是每个都进行注册那程序就显得太繁琐了
离线小韩老师

只看该作者 5楼 发表于: 2019-09-28
1、如果数据量比较大,考虑性能的就需要使用,型视图模式了。

2、如果单单结构体比较复杂,希望懒省事。那就看你的需求了,如果界面只是显示不需要操作数据,你可以将数据组合成字符串直接显示,值需要注册一个属性字符串。如果你需要对每个数据进行编辑操作,感觉单个属性注册也是必要的。
3、由于SLOT和SIGNAL都可以直接在QML中操作,你不想注册,完全可以多定义信号和槽函数,在QML直接调用。
离线cllssg

只看该作者 6楼 发表于: 2019-09-28
回 小韩老师 的帖子
小韩老师:1、如果数据量比较大,考虑性能的就需要使用,型视图模式了。
2、如果单单结构体比较复杂,希望懒省事。那就看你的需求了,如果界面只是显示不需要操作数据,你可以将数据组合成字符串直接显示,值需要注册一个属性字符串。如果你需要对每个数据进行编辑操作,感觉单个属性注册也 .. (2019-09-28 10:34) 

感谢,我正在琢磨模型视图,看看能不能解决这个问题
离线angelus

只看该作者 7楼 发表于: 2019-09-29
我处理比较简单,列表型数据使用qlist<QVarint> 传递到qml  ,简单数据直接传递qvariant或者json
离线XChinux

只看该作者 8楼 发表于: 2019-09-29
你的QML只是显示,而且还还不需要实时显示(200毫秒产生一个新数据,QML界面不需要)。
所以你可以核心全放在C++里,QML界面需要什么数据的时候调用C++接口获取相应的数据返回即可。无论如何QML只是显示某一个状态下一部分数据而已。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线cllssg

只看该作者 9楼 发表于: 2019-10-06
感谢各位,已经解决,就是用的qlist<qvarint>进行的数据传递。
离线nikonice

只看该作者 10楼 发表于: 2019-11-14
json最方便
离线xiaohuyang

只看该作者 11楼 发表于: 2019-11-14
回 cllssg 的帖子
cllssg:感谢各位,已经解决,就是用的qlist<qvarint>进行的数据传递。
 (2019-10-06 18:45) 

不是要少用QVar ?
快速回复
限100 字节
 
上一个 下一个