Qt中自定义信号与槽
在学习信号和槽的时候,我们知道信号一般对应的就是用户的行为,槽指的是接受到信号后的响应,在类内有许多的内置信号和槽函数,能够去实现一些常见的行为,但实际业务开发中,尤其是接受到信号的响应会根据具体的业务逻辑有所不同,所以需要自定义信号和槽函数
1. 如何自定义槽函数
1)基于代码的方式
所谓的槽函数,其实在Qt5过后,和普通的函数没有区别,在Qt5之前,在对槽函数的定义和声明时,需要加上关键字“public/private/project solts”,例如:
slots是Qt自己扩展的关键字,像这些扩展的关键字是不属于C++语法的
*为什么Qt可以在C++的语法上拓展关键字?
因为Qt采用了元编程技术,即基于代码生成代码,qmake在创建Qt项目的时候,就会调用专门的扫描器,去扫描这些关键字,基于这些关键字生成一系列相关的代码
2)基于图形化的方式
基于图形化的方式:
通过图形化的方式,可以直接右键指定的控件,然后转到槽函数,这里包括了所有该控件内的信号(包括其父类的),选择好后会自动生成代码,跳转到槽函数的定义,如下
这种方式定义的槽函数是直接就关联好相关信号的,而不是通过connect函数进行关联的,这里是通过命名的方式,这是Qt内部做的处理,我们可以看到上面的例子,命名风格是:
on_控件变量名_关联信号名
之所以可以通过命名就关联,是因为ui生成的文件QWidget类内存在connectSlotsByName这个函数,具体的实现不做过多研究。
2. 如何自定义信号
Qt中一般很少用到自定义信号,这是由于信号一般对应用户的操作,而用户的操作是可以穷举出来的,通常的操作在Qt内都存在定义好的,但不排除有少数需要用到的时候。
所谓信号,其实本质上也是函数,但又比较特殊,信号函数的特殊:
1)只需要写出函数声明,并告诉Qt,这是一个信号即可,这个函数的定义是Qt在编写过程中,自动生成的,且不可干预,信号是Qt中的特殊机制,Qt生成的信号函数的实现要配合Qt框架做很多既定的操作,所以这个过程通常不可干预,而是又Qt自己生成,声明信号函数的方法是用到Qt拓展的关键字signals
2)作为信号函数,这个返回值必须是void,有无参数都可,甚至可以重载
例:
此外,定义好信号后,还需要定义什么时候发送信号,发送信号的方式,在Qt5之前是需要用到关键字emit的,但现在可以不用,但为了区分信号函数,最好是需要带上emit的。
具体举个例子
我先用图形化的方式创建一个按钮,并且编写这个按钮的槽函数,槽函数内容就是发送我自定义的信号。
然后我再将我自定义的信号关联到一个我自己写一个自定义槽函数上,函数功能为将界面的标题修改。
总结
本章学习了如何自定义信号和槽,了解了Qt拓展的一些关键字以及使用方式,这里做个简单总结:
public slots : 自定义槽函数用的关键字
图形化定义槽函数
on_控件名称_信号名称 : 以命名的方式关联信号和槽函数
signals:声明信号函数的关键字
emit : 表示信号发送的关键字