Qt教程-自定义信号槽和信号槽的实现

我们说Qt不仅是一个GUI的库,可以说Qt是一套框架,除了提供GUI的功能Qt还提供了一系列的东西。我们之前提到的信号槽,也不仅仅只能在GUI程序中使用,信号槽是作为一种核心特性提供的,当然我们也可以注册自己的信号和槽函数。
有关语法我们可以直接看到custom_signal下面的custom_signal.hpp。

这里我们定义了2个类,一个是CCustom_Signal其中包含了名叫 clicked的信号,叫send的信号发送函数另一个是CCustom_Slot其中定义了一个叫recv的槽函数。
由于具体的介绍参见代码注释。
我们总结一下自定义信号和槽的步骤:
1、定义信号必须在一个类中,并且这个类必须是QObject的子类(也就是必须继承QObject)。
2、类中定义信号之前,必须包含Q_OBJECT宏。
3、声明信号函数之前必须使用signals标签。
4、定义信号时我们只需要声明信号函数,我们不要自己定义信号函数。
我们不难发现一个问题,Qt当中这些特有的关键字为什么能最终通过gcc这样的编译器进行编译,有些语法明明不符合C++的标准。当我们使用Qt进行开发时源代码交给标准 C++ 编译器(如 gcc )之前,需要事先将这些扩展的语法去除掉。完成这一操作的就是 moc(Meta-Object Compiler,也就是“元对象编译器”)。moc负责把这些扩展语法转换成标准的C++语法,这个过程就像预编译处理。在笔者的电脑上Qt的安装路径是/opt/Qt5,moc最后的路径是/opt/Qt5/5.8/gcc_64/bin/moc,在调用gcc编译之前我们可以看到会先调用moc进行预编译处理。
使用Qt后在程序编译上的流程就和普通的C++程序有些区别了,我们这里简单的梳理一下。
当我们在Qt Creator上按下编译按钮后会有下面的几个步骤
1、执行qmake。qmake会根据项目配置生成makefile。这样我们在执行make的时候就可以自动进行moc等操作。
2、执行moc转换代码为标准的C++代码。
3、由C++编译器进行编译。
4、由C++链接器进行链接。
当然,这里我们自定义了一个信号和槽一共两个类,那么要如何使用这两个类呢?这里我们也做一个对应的演示。

要使用在头文件中定义的类,那么首先我们理所当然的要include对应的文件。
这里我定义了一个csig类并把csig对象中的clicked对象和cslot这个对象中的recv函数连接了起来。
recv函数最后会调用传入的QPushButton对象的clicked函数,其实也就是向这个QPushButton对象发出clicked信号。在Qt中emit实际上是一个宏,但是这个宏是空的,没有做任何操作。emit这个关键字只是用来明确标识是在发送信号。
最后我们看到我们使用了csig的send函数,并传入了button对象的引用。
也就是说这里实际上是向button对象发送了点击信号,所以当exec执行后就会弹出2个对话框。
如下图所示:

工程源代码下载地址:
https://www.exvs.org/wp-content/uploads/public/Qt_Tutorial/custom_signal_6F457F93.7z

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.