概述
消息与消息处理
我们都知道在Qt中的消息处理机制是信号与槽,在实际程序开发中也就是通过将组件产生的信号与对应的槽函数连接起来就可以实现预想的功能了,那么应用程序是如何感知到这个信号的?
在Qt中封装了具体操作系统的消息机制,遵循经典的GUI消息驱动事件模型。
当产生一个用户事件后,首先得到感知的肯定是操作系统,操作系统根据事件类型将其转换成对应的应用程序消息发给应用程序,程序收到这个消息后就会调用对应的消息处理函数。
信号与槽
Qt中如何表示用户消息?
Qt中如何将用户消息映射到消息处理函数上?
Qt中的消息映射需要遵循什么规则?
在Qt中定义了几个与系统相关的概念:
信号:操作系统产生的消息
槽:程序中的消息处理函数
连接:将信号与槽关联起来
两个对象通过connect连接产生关联,在QObject_1对象发出信号,在槽函数所在的QObject_2对象上执行。连接就相当于关注了某人后,当她有动态时你能及时收到她发动态的消息,而消息处理函数就相当于你点开她的动态,所以信号到槽的关联必然是发生在两个对象上的。
如上所说,信号与槽包含两个对象:发生信号的对象和接收信号的对象。
通过connect函数将他们之间建立起映射,根据参数可知Qt中的信号和槽函数使用字符串描述,而SIGNAL和SLOT关键字能将两个字符串变得有意义。
SIGNAL关键字用于指定消息名,SLOT用于指定消息处理函数名。
另外两个在自定义槽的类中出现的关键字是Q_OBJECT和slots。
Q_OBJECT:凡是自定义了槽的类都必须在类的开始处填入此关键字,它包含一些经过元对象编译器处理后的内容,元对象编译器在处理信号与槽时会将Q_OBJECT进行扩展,会生成一个以moc_开头的文件,里面就是描述Q_OBJECT的,元对象编译发生在程序的预处理之前。
slots:用于声明一个函数是槽函数,它的访问级别有public、protected和private。
起始还有两个关键字:signals和emit。
自定义信号
- 在Qt中是可以自定义信号的,通过signals关键字声明一个信号,参数列表可以自 定义,但是与关联的槽函数在参数列表上必须一致。
- 同样使用connect函数将信号与槽关联。
- 自定义的信号只有声明没有实现。
- 通过emit关键字发送自定义信号。
自定义槽
- 只有QObject子类才可以自定义槽。
- 使用slots关键字声明函数为槽函数。
- 不光有声明还必须有实现。
- 槽函数在参数列表上与信号保持一致。
- SIGNAL和SLOT指定的名称中必须可以包含类型,但不能包含具体变量名。
解决经典问题:Object:connect:No such slot…
1、检查类是否继承自QObject,即Qt对象。
2、检查类声明开始处是否声明Q_Object
3、检查是否使用slots关键字声明成槽函数
4、检查是否有拼写错误
5、重新执行qmake
当然,既然存在connect,那么也必然存在disconnect,其用法就是:
disconnect(this, SIGNAL(…), this, SLOT(…));
最后
以上就是英俊帆布鞋为你收集整理的Qt学习之路6--消息处理之信号与槽的全部内容,希望文章能够帮你解决Qt学习之路6--消息处理之信号与槽所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复