【QT学习笔记】在C++的QT库中对象间,使用信号槽传递多类型数据

14 篇文章 4 订阅

在学习QT和工程中,经常会用到将线程间的数据传输到另外的线程或者对象中,方便之后的数据使用和处理。但是想不同线程间通过QT中信号和槽的机制可以完成除“结构体”之外数据类型的传递任务。但是实际上,一次的传输有可能出现的是集中情况,在这种情况下,发送结构体有些不太方便:

1、单一数据类型、多数据发送(eg. double A,double B,.............,doubleAB)

  如果可以将QT工程使用QVector等类似于C++ stl标准库,QT继承重写的,用法类似于C++   中vector的用法

eg:

QVector<double> offset_x(3,1);

之后就可以使用信号和槽,不同之处,可以发送QT中的变量,QVector<QString>  temp_str01;还不错。

2、对于多种数据类型、多组数据(eg:double, int, QString, double)

这时还暂时不需要结构体的方法,如果对于速度传输要求不是特别的高,那么可以将这些数据进行“封包”处理成QString,使用信号和槽进行发送数据。之后再接收的槽函数中,可以完成响应的“分包”重新定义变量,重新赋值。

在这里就是讲产品型号和序列号同时封包

之后再接受的槽函数中进行拆包进行解析,重新定义,进行重新定义变量,然后就可以使用了。优点,感觉变焦方便;缺点,有解析这一步,比起结构体直接访问元素还是要差一点。(直观感受,没有详细测试)

3、最后一种方法,如果出现了大量的数据传输,可以使用结构体,不过需要做一些操作:

qRegisterMetaType:注册元类型主要是在定义信号槽的时候,传递的参数类型不一定是QT所识别的,QT不识别的就要先注册以下,让QT能够认识,就是用qRegisterMetaType注册。我的理解就是,先不需要QT的编译器知道信号和槽所要传递的数据类型,进行先期定义,QVariant经过实际的验证,是可以进行在信号和槽中完成结构体的传递的。下方链接可以看一下

https://blog.csdn.net/Bruce_0712/article/details/53767601?ops_request_misc=&request_id=&biz_id=102&utm_term=QT%20%E4%BF%A1%E5%8F%B7%E6%A7%BD%E4%BC%A0%E9%80%92%E7%BB%93%E6%9E%84%E4%BD%93&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-53767601

 

https://blog.csdn.net/liji_digital/article/details/82904680?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159384526419725250119754%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=159384526419725250119754&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v3~pc_rank_v3-1-82904680.pc_ecpm_v3_pc_rank_v3&utm_term=QT+%E4%BF%A1%E5%8F%B7%E6%A7%BD%E4%BC%A0%E9%80%92%E7%BB%93%E6%9E%84%E4%BD%93

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt 中,信号是一种用于对象通信的机制。它们允许一个对象发出信号,另一个对象可以接收这个信号并做出相应的处理。当一个对象发出信号时,它可以传递任何类型数据,包括指针。在信号机制中,信号的参数必须匹配,否则编译会失败。 如果想传递局部数据指针,需要注意以下几点: 1. 局部指针变量在函数执行完毕后就会被销毁,因此不能直接把指针作为参数传递信号。 2. 如果需要在信号使用局部指针变量,需要将其分配在堆上,以确保在执行完函数后仍然存在。 3. 在信号的调用中,如果使用了堆上的指针,一定要注意释放内存,否则会导致内存泄漏。 下面是一个例子,演示如何在信号传递局部数据指针: ```c++ class MyClass : public QObject { Q_OBJECT public slots: void mySlot(MyObject *obj) { // process obj pointer here delete obj; // don't forget to release memory } signals: void mySignal(MyObject *obj); }; void MyClass::myFunction() { MyObject *obj = new MyObject(); // allocate on heap emit mySignal(obj); // emit signal with obj pointer } ``` 在上面的例子中,MyClass 中的 myFunction() 函数会在堆上分配一个 MyObject 对象,并将其指针传递给 mySignal() 信号。当该信号被触发时,会调用 mySlot() 函数,并将指针作为参数传递给它。在 mySlot() 中,可以使用指针进行任何处理,并在处理完成后释放内存。 需要注意的是,在信号传递指针需要特别小心,因为它涉及到内存管理和资源释放问题。确保在使用完指针后及时释放内存,避免内存泄漏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值