那么我们之前学习了计算器的界面制作,但是只是实现了一个计算器的界面,还不具有计算器的功能。
接下来我们就要学习在QT中如何进行消息的处理,比如你按下1键之后,QT会如何处理这个信号。QT封装了具体操作系统的消息机制,同时它遵循经典的 GUI 消息驱动事件模型。
QT中定义了与系统消息相关的概念,接下来我们将介绍3个概念:
1、信号(signal):由操作系统产生的消息
2、槽(slot):程序中的消息处理函数
3、连接(connect):将系统消息绑定到消息处理的函数
QT中消息处理机制:
信号到槽的连接必须发生在两个 QT 类对象之间!!!
Qt 的核心 -- QObject::connect函数
Qt 中的 “新” 关键字:
1、SIGNAL :用于指定消息名
2、SLOT :用于指定消息修理函数名
3、Q_OBJECT:所有自定义槽的类必须在类声明的开始处加上 Q_OBJECT
4、slots :用于在类中声明消息处理函数
在介绍了这么多的概念之后,我们是不是想要试一下,这个具体是怎么进行操作的,接下来我们就要进行试验,我们只需编写一个简单的示例源程序进行说明即可。
示例代码:
#include <QApplication>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QPushButton b;
b.setText("Click me to quit");
b.show();
return a.exec();
}
在构建源码之后,运行可执行程序,得到如下界面:
但是我们点击 Click me to quit! 这个按钮,却发现窗口并没有退出,这是为什么呢?相信聪明的大家已经发现,我们这个示例代码没有 connect 函数,也就是说我们并没有对它进行消息的连接处理,所以我们加上这句代码
QObject::connect(&b, SIGNAL(clicked()), &a, SLOT(quit()));
再次运行后,发现窗口已经完美退出。现在我们就已经实现基本的一个消息处理了。大家可以自己实践下。
接下来我们继续回到我们的主线,也就是计算器的信号处理。我们上面示例代码中调用的槽是 Qt 自带的,那么我们的计算器想要的处理槽必须是自定义的,所以我们得自定义槽。那么自定义槽有什么要注意的呢?听我给大家一一道来,ps开玩笑的啦。
有这么几点需要注意:
1、只有 QObject 的子类才能自定义槽
2、定义槽的类必须在声明的最开始处使用 Q_OBJECT
3、类中声明槽时需要使用 slots 关键字
4、槽与所处理的信号在函数签名上必须一致
5、SIGNAL 和 SLOT 所指的的名称中:可以包含参数类型;不能包含具体的参数名
接下来我们继续实现计算器的槽处理的代码了。
我们在 QCalculatorUI.h 添加过后的代码如下, 而在onButtonClicked 函数中实现的是打印这个函数名,最后实现的效果图如下:
现在已经基本实现了自定义槽的效果,接下来我们就要实现,按下什么键,就显示出什么,思路是一样的,直接在里面打印对应的名称数组的名字。
关于这块有个经典的问题:Object::connect:No such slot ...
解决方法如下:
1、检查类是否继承于 QObject
2、检查类声明的开始处是否添加 Q_OBJECT
3、检查是否使用 slot 关键字进行槽声明
4、检查槽的名称是否拼写错误
5、重新执行 qmake
那么博主在做这个实验的时候,类声明的开始处忘了添加 Q_OBJECT这个关键字了,导致这个问题出现了。希望大家不要跟博主犯同样的错误了。好了,有关信号与槽相关的知识,我们就学习到这了。
以上内容来自狄泰软件学院的QT教程,欢迎大家一起来学习,可以加我QQ:243343083,一起学习。狄泰技术交流群:199546072
原文地址:http://blog.51cto.com/12810168/2088181