如何使用Qt5中信号和槽强大的新语法

 时间:2024-11-01 13:33:42

在Gui编程中,当我们需要改变一个控件的时候,我们经常会想要通知另一个控件,或者控件之间进行通信,很多开发库用的是回调,而Qt用的是信号和槽。Qt5中的信号和槽的语法和Qt4有些不一样了,这里我们讲一下有哪些区别,以及新的语法特性怎么理解和使用吧。不懂的对照帮助文档看看吧。

如何使用Qt5中信号和槽强大的新语法

工具/原料

QtCreator4.4.1

Qt5.9.2

方法/步骤

1、Qt4中的信号和槽的一般语法如下图:SIGNAL和SLOT宏将里面的参数,即我们看到的函数名及参数,转换为字符串,我们可以看connect函数的声明,如下图。connect函数会对经过moc程序生成的字符串进行比对。

如何使用Qt5中信号和槽强大的新语法

如何使用Qt5中信号和槽强大的新语法

2、那么上面的connect语法会产生一些问鞑民略锈题:譬如,编译的时候不会进行参数检查,只有在运行时通过传递参数来进行检查。所以当你在信号和槽里面拼错单词的时候,信号和槽虽然没有连接,但是粕盘镱嘧编译却是通过的。如下图,我把clicked信号拼错,编译过了。运行也通过,只是连接并没有建立,这个仅仅是一个警告,而不是错误!

如何使用Qt5中信号和槽强大的新语法

如何使用Qt5中信号和槽强大的新语法

3、还有就是因为这种操箧咦切诏作是传递字符串的,所以信号和槽的参数必须是一致的,并且头文件和connect语句中也是如此。这样,当我们橇秆苡螳想要用类型定义typedef或者命名空间namespace的时候,就不起作用了。如下图,我们用类型定义了int为AInt,但是在连接的时候,仅仅只是字符串的不同,信号和槽就不认得了。提示出错,本来应该在按钮上显示数字5,但是没有显示。

如何使用Qt5中信号和槽强大的新语法

如何使用Qt5中信号和槽强大的新语法

如何使用Qt5中信号和槽强大的新语法

如何使用Qt5中信号和槽强大的新语法

4、如果我们把上面的例子中connect中的参数都换成一致的话,再看看结果。如下图。数字5显示出来了。没有出错吧。

如何使用Qt5中信号和槽强大的新语法

如何使用Qt5中信号和槽强大的新语法

5、而在Qt5中,Qt4的信号和槽语法依然兼容,但是新的信号和槽的语法特性让你更加得心应手哦。现在我们再改改上面的例子,我们把连接参数改为函数指针。然后再试试用类型定义的AInt去声明信号,结果如下图,数字5显示出来了。信号和槽的类型字符串确实不同,但是却是可以通过的。

如何使用Qt5中信号和槽强大的新语法

如何使用Qt5中信号和槽强大的新语法

6、我们聪艄料姹再来试试上面的拼错情况吧。把按钮的clicked信号拼错,结果在我的qtcreator编辑器上面因为有语法检查插件,所以,大家直接就会看到,QPushButton实际上并没有这个Cli艘早祓胂cked信号,于是显示错误,当然,如果你编译的话,这里也会出现错误的,而不再仅仅只是警告了。

如何使用Qt5中信号和槽强大的新语法

如何使用Qt5中信号和槽强大的新语法

7、然后我们再看另一种情况,这种用法更加强大哦,那就在Qt5中,信号不仅仅和槽连接了,只要是个函数,就可以和信号进行连接了哦。看下图,我们声明的doTest函数只是一个普通的private函数,结果数字5显示,connect连接建立。

如何使用Qt5中信号和槽强大的新语法

如何使用Qt5中信号和槽强大的新语法

8、最后,Qt5信号和槽还有一种更为强大的语法支持,就是lamda表达式。使用lamda表达式,我们可以做到异步执行,这里我们建立socket,当连接的时候显示提示语“nicejob”。如下图。

如何使用Qt5中信号和槽强大的新语法

如何使用Qt5中信号和槽强大的新语法

9、当我们需要对返回参数进行处理的时候,相当于回调函数,我们可以使用lamda表达式进行参数的设置,如下图,点击按钮,当按钮可以按下的时候,显示"nice"。同样如果你是使用socket的时候,也可以按照连接状态进行处理。

如何使用Qt5中信号和槽强大的新语法

如何修改Visual Studio项目的程序集名称 解决CannotAcquireResourceException问题 eclipse如何导入开发需要的jar包? Navicat for MySQL中如何创建打开表快捷方式 html中div布局及其图片插入链接
热门搜索
水果蛋糕图片 蓝色图片 迪迦奥特曼图片 痱子症状图片 内扣发型图片