当前位置:网站首页 > C++编程 > 正文

getcommevent 返回值(getcolumns()返回值)



Qt信号槽到底可不可以有返回值呢?问了下身边的同事,有的人说可以,有的人说不可以。 在实际项目中,确实没看到过有人使用带返回值的信号槽,可以说存在感很低。平时大家工作也比较忙,所以也没有时间去较真信号槽到底能不能有返回值。今天就一起带大家较真一下,看一看信号槽能否有返回值。如果可以有返回值,那么又有哪些限制导致大家都不用它呢?

提示:本文代码略多,但是都很简单,请耐心阅读。

新建一个Qt Widgets Application,在Qt为我们生成的主窗口.h文件中,添加信号槽的声明,分别是

完整代码如下:

在.cpp文件中,建立信号槽连接,实现槽函数,发送信号并打印返回值。完整代码如下:

代码很简单,运行结果如下:

答案很明确:「信号槽可以有返回值。」 即槽的返回值会传递给信号,作为信号的返回值返回。 得出上述结论只是第一步。

下面开始我们的第二问: 是否所有情况下,信号槽返回值都可以正常工作呢?

在确保信号槽正常连接,并能够成功发送接收的前提下,影响信号槽工作的因素就只有在connect信号槽时指定的、信号槽的连接方式。 我们知道信号槽的连接方式有以下几种:

严格来说,最后一个UniqueConnection是用来保证信号槽一对一连接的,从实现机制上并不算是一种连接方式。所以我们依次测试前四种连接方式,得到了不同的结果。

默认连接方式,输出和前面的输出相同。

即代码改成:

此种为直接连接方式,相当于函数调用,输出结果为

可以看到,返回值可以正常返回。

即代码改成:

此种为异步消息方式连接,用于将消息发向具有消息循环的线程,以消息的方式传递信号,信号槽既可以在同一个线程,也可以在不同的线程。这里在主线程进行了测试,输出结果为

线程间信号槽返回值测试结果相同。可以看到异步消息方式,信号槽返回值无法工作。

此种方式用于多线程环境下,一个线程向另外一个线程发送信号,并阻塞等待槽执行完成。 下面是多线程的测试代码,添加了一个新的QObject子类:ObjectInSubThread,用于在子线程中运行。代码如下(想要直接看结果的同学可直接跳过):

ObjectInSubThread.h头文件

ObjectInSubThread.cpp实现文件

同时修改mainwindow类的代码:

mainwindow.h

mainwindow.cpp

输出结果:

表明信号槽返回值功能可以正常工作。

「综上所述:」

上面讲解了不同连接机制下的运行情况。在实际使用时,也有一些情况需要考虑。 比如,一个带返回值的信号,连接到多个带相同类型返回值的槽,最后的返回值是什么? 新建Qt Widgets Application测试,下面是测试代码:

mainwindow.h文件

mainwindow.cpp文件

如上所示,信号sigCurrentTime分别连接到了槽slotCurrentTime1()和槽slotCurrentTime2()。 输出结果为:

可见,最后输出结果只有一个,另外一个结果丢失或被覆盖,这是符合逻辑的,因为返回值只能有一个,最后的结果会覆盖前面的结果。

本文从实现机制角度、应用场景角度对信号槽返回值功能进行了实验和分析,基本涵盖了工作中的各种使用情形,弄清楚了在不同的情况下,信号槽返回值功能的表现情况。一句话总结就是:

正是因为信号槽返回值限制太多,所以才几乎没有人使用。但是我们的研究没有白费,通过研究的过程也加深了我们对信号槽机制的理解。

关于信号槽,有太多话题可以聊,后面会推出更多相关文章,敬请关注!

哔哩哔哩对代码的支持似乎不太好,希望改进一下~

本文首发于“Qt未来工程师”。

到此这篇getcommevent 返回值(getcolumns()返回值)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • pc客服电话(电脑客服电话)2025-07-09 09:45:04
  • c++ ifstream头文件(c++ ifstream read)2025-07-09 09:45:04
  • 怎么删除虚拟环境csdn(怎么删除虚拟环境)2025-07-09 09:45:04
  • tomcat9.exe乱码(tomcat出现乱码)2025-07-09 09:45:04
  • max202e工作原理(max202cpe工作原理)2025-07-09 09:45:04
  • ceph存储(ceph存储搭建)2025-07-09 09:45:04
  • plc10ms定时器(plc10ms定时器与100ms定时器区别)2025-07-09 09:45:04
  • pcp文件是什么意思(pcf文件是什么意思)2025-07-09 09:45:04
  • libco源码分析(licode 源码分析)2025-07-09 09:45:04
  • dhclient(dhclient命令找不到)2025-07-09 09:45:04
  • 全屏图片