当前位置:网站首页>基于QT的CAN通讯数据实时波形显示(连载八)====“子函数或新类调用ui控件”
基于QT的CAN通讯数据实时波形显示(连载八)====“子函数或新类调用ui控件”
2022-07-30 05:45:00 【透明的光】
前言
主程序里数据传输到新的类里(这里是线程,其他类似)后,需要在里面绘图,这样就需要调用ui界面的控件。网上搜寻到很多方法,都一一试验,但是都没有办法完美的实现,不是这里错,就是那里错。所以有点怀疑是不是自己用了一个假的QT,为啥,不知道,就是参照他们的方法出不来。和高手讨论并且结合网上的例子,搞出来一个可以解决的方法,很好用,并且和上文中的方法一致,很方便。
第一部分:子函数或其他类调用ui控件
第一步:在主函数的ui里建立一个控件,这里使用的是qcustomplot里的控件,这部分不会添加的可以参考前面的文章的方法,很方便并且很简单,步骤都很详细。这里采用了一个提升的widget,现在为qcustomplot类。名字为PLOTVSAMP。其实直接拉一个按钮也是可以的,这个我试验过了,可以的。
第二步:在主函数里,定义函数。第一句上文里已经介绍,在主函数里定义新的类,这个类名字也就是其新起的class名字。至于他是哪个父类的子类不重要。我这里他的父类是线程QThread类。怎么建立参考前面的文章,写的很详细。
mythread = new datadeal(this);
mythread->SetMainWindow( this );第三步:将主函数h文件里的私自成员改为公共成员,这个位置应该很容易找到。为新类调用ui控件做准备。
public:
Ui::MainWindow *ui;第四步:第二步已经设置函数,并没有函数主体,在新类的h文件里加入函数声明与主体,这里定义主窗口的指针(不太合适,就这样看吧,叫法有点问题,方便理解),其实第二步中,this指的就是mainwindow里的指针,这里作为形参放进去,这个就是mainwindow的入口,定义为pwinmain。同时将这个指针赋值为m_pwinmain,这样就将主窗口的指针给了新类中的指针。
public:
void SetMainWindow( MainWindow* pWinMain )
{
m_pWinMain = pWinMain;
}第五步:新类的指向主程序的指针已经有了,再定义这个指针所在的位置和主程序的位置是一样的。
private:
MainWindow* m_pWinMain;第六步:再次用通俗的话解释逻辑:造桥
(1)两块地中间有沟壑,需要两地交流,必须造个桥;
(2)第一块地先造个桥墩,第二块地也造个桥墩;
(3)桥墩上用桥连接。
(4)桥这边的火车和桥那边的火车交换车厢送货,这边的汽车和那边的汽车交换送货。
类似的:
(1)mainwindow的类,和定义的新类,相当于两块地;
(2)火车和汽车,相当于各个类里面的成员,想要送货,必须是火车对火车,汽车对汽车。汽车好比ui控件,火车好比其他定义变量;
(3)两个类必须成员相同,两边都必须有火车和汽车。所以mainwindow的类必须定义新类(第二步),新类必须定义mainwindow的类(第五步);
(4)mainwindow的类定义的setmainwindow相当于桥墩,先一边建好。
(5)setmainwindow里的函数,将两个联系起来,就是桥(第四步)。
这样新类里面的汽车就可以和mainwindow里面的汽车(ui控件)直接送货了。
第七步:用m_p的就可以联想出ui控件了,然后再次画图,里面graph函数之类的参看前面文章,很详细。当然也可以是其他控件,试验过改变按钮的大小和文字,都可以用。
m_pWinMain->ui->PLOTVSAMP->graph(0)->setData(gvUTCms,gvUTCms);
m_pWinMain->ui->PLOTVSAMP->replot();第二部分:总结
总体步骤和《基于QT的CAN通讯数据实时波形显示(连载七)====“不同class数据传输”》里的逻辑相同,这个应该很好理解了。
CAN帧里有毫秒数,将ms数发送给新类(线程),在主程序中启动线程,进行画图,可以得到正确的图形。左侧为前面文章制作的CAN帧显示程序,右侧波形为现在新的class里面在ui界面中绘图。

注:由于小伙伴需要源代码的时间不同,登录邮箱界面太多麻烦,所以建立了一个订阅号,如果有问题或者需要源码,可添加订阅号,留言后会发送源代码或者有任何问题可留言,将积极解决提出的问题。

边栏推荐
- MySQL special statement and optimizer
- Arthas 命令解析(watch/tt/sc)
- 十四、Kotlin进阶学习:一、内联函数 inline;二、泛型;三、泛型约束;四、子类与子类型;
- 基于R语言地理加权回归、主成分分析、判别分析等空间异质性数据分析
- 【青岛站】SWAT模型高阶应用暨无资料地区建模、不确定分析与气候变化、土地利用对面源污染影响模型改进及案例分析研讨
- 单例模式:Swift 实现
- Pytorch(二):数据读取机制(DataLoader、DataSet)与图像预处理模块(transforms)
- 正则表达式语法详解及实用实例
- Redis publish/subscribe
- nodejs PM2监控及报警邮件发送(二)
猜你喜欢

MySQL data types and footprint

SQL Server Installation Tutorial

Pytorch(二):数据读取机制(DataLoader、DataSet)与图像预处理模块(transforms)

MySQL window function

正则表达式语法详解及实用实例

R-GIS: 如何用R语言实现GIS地理空间分析及模型预测

DeepLearing4j's deep learning Yolo Tiny realizes target detection

FPGA解析B码----连载2

树莓派OpenCV+OpenCV-contrib

标准化(Normalization)知识点总结
随机推荐
MATLAB怎么在图像中显示nii文件切片信息?
十、Kotlin基础学习:1、延迟加载;2、异常处理;3、使用 throw 主动抛出异常;4、自定义异常;
Pytorch(一):动态图机制以及框架结构
Conda 安装 tensorflow gpu 1.13.1(验证可行)
Biome-BGC 生态系统模型与应用
基于MATLAB 2021b的机器学习、深度学习
用户密码加密编码使用 Bcrypt 代替 MD5,SHA1和SHA256
Map making of environmental impact assessment based on remote sensing interpretation and GIS technology (the latest guidelines)
【青岛站】SWAT模型高阶应用暨无资料地区建模、不确定分析与气候变化、土地利用对面源污染影响模型改进及案例分析研讨
1.03 original Acegi security mechanism
Rsync realizes folder or data synchronization between Win systems
Generalized Focal Loss paper reading notes
二叉树(一):深度优先遍历与广度优先遍历
建造者模式(Swift 实现)
nodejs PM2监控及报警邮件发送(二)
基于R语言地理加权回归、主成分分析、判别分析等空间异质性数据分析
二十一、Kotlin进阶学习:实现简单的网络访问封装
二十二、Kotlin进阶学习:简单学习RecyclerView实现列表展示;
边境的悍匪—机器学习实战:第十五章 使用CNN和RNN处理序列
单例模式:Swift 实现