第一章 1.4 信号,槽和元对象

相比于C++ , Qt的信号和槽是一个强大的功能 。 信号和槽对对象之间传递数据提供了一种灵活高效的方法 。 信号和槽的概念是Qt首创 , 后来的Boost库也是借鉴Qt中的概念实现自己的信号槽 。
【第一章 1.4 信号,槽和元对象】直接看书中的示例:
第一章 1.4 信号,槽和元对象文章插图
第一章 1.4 信号,槽和元对象文章插图
我们直接看信号这种方法是怎么用的 。 首先在类声明的signal(1)域中声明信号 , 无须定义 , 在需要的时候使用emit(5)将参数发送出去 , 那么发送出去之后的接收者是谁呢 , 就是文章开始处提到的槽函数(3) 。 当然信号发送出去 , 相应的槽函数能够接收到 , 有两个前提 , 首先要把信号和槽关联起来 , 其次 , 信号和槽的参数 , 槽函数的参数<=信号的参数 , 同时参数类型必须相同 。 信号和槽的关联使用connect函数 。 书中示例如下:
第一章 1.4 信号,槽和元对象文章插图
第一章 1.4 信号,槽和元对象文章插图
这本书是Qt4时代出版的 , 发展到Qt5 , 官方推荐链接信号槽的方法如下:
第一章 1.4 信号,槽和元对象文章插图
关于信号和槽的连接有很多内容 , 包括上述的第二种写法为什么被推荐 , 结合C++11的lambda表达式 , 连接方式等 , 后边我会写一篇专门的文章来讲解 。
信号和槽是通过函数指针来实现的 。 注意到上面signal域里面的声明的textChanged , 我们并没有去实现它 。 这其实依赖的是Qt强大的元编译 , moc 。 moc会帮助我们实现textChanged 。 此函数使用持有连接槽的元对象 , 可以调用连接到信号的任何合法的槽函数 。 元对象包含指向槽的函数指针 , 以及它们的名称和参数 , 还包含可用信号及其名称和参数类型的列表 。 connect函数通过元对象 , 将槽添加到信号的调用列表中 。 当上述提到的信号和槽的参数相互匹配时 , 则在信号和槽之间建立了有效连接 。
没接触过Qt的朋友可能对上述提到的元编译有疑问 , 我们上一篇讲的是Qt应用程序的构建 , 那在下一篇中会解释Qt程序和普通的C++程序构建过程的不同 。