signal-slot 信号/槽(也译信号/插槽)机制

本文详细介绍了Qt中的信号与槽机制,包括如何使用`public slots`定义接收状态变化信息的槽函数,信号与槽的默认参数规则,以及如何在连接时选择最匹配的重载版本。此外,还探讨了高级用法,如利用`QObject::sender()`获取信号发送者,以及使用`QSignalMapper`处理多个信号。最后,文章提到了在Qt中与其他库的信号槽机制共存的方法和配置技巧。
摘要由CSDN通过智能技术生成

前言

Qt是Nokia今后最重要的开发平台,Symbian、Maemo、MeeGo都将使用Qt。
鉴于以下原因:

n  市场上面几乎不存在相关的中文资料

n  许多开发者对E文很是感冒

n  电子版的文档方便技术传播和交流

 

DevDiv.com移动开发论坛的翻译组重操宝刀,利用业余时间和相关方面的经验,把一些好的Qt英文资料翻译成中文,为广大嵌入式移动开发者尽一点绵薄之力。

 

关于DevDiv翻译组

 

请参考DevDiv详细内容

 

技术支持

首先DevDiv翻译组对您能够阅读本系列文档以及关注DevDiv表示由衷的感谢。Qt for Symbian开发是一个比较新的技术,在您学习和开发过程中,一定会遇到一些问题。DevDiv论坛集结了国内一流嵌入式移动开发专家,我们很乐意与您一起探讨Qt及相关问题。如果您有什么问题和技术需要支持的话,请登陆网站www.devdiv.com或者发送邮件到webmaster@DevDiv.com,我们将尽快回复您。


关于本文的翻译

 

感谢crystalblu,sand.fj.wen对本文的翻译,同时非常感谢Cxt_programmer在百忙中抽出时间对翻译初稿的认真校验。才使本文与读者尽快见面。由于书稿内容多,我们的知识有限,尽管我们进行了细心的检查,但是还是会存在错误,这里恳请广大读者批评指正,并发送邮件至BeyondVincent@devdiv.com,在此我们表示衷心的感谢。

注:本文原文地址:信号&槽

 

               第一章      信号&槽(Signals and Slots)

信号和槽通常用于对象间的通信。信号和槽机制是 Qt 的主要特性并且也很有可能是它与其他框架特性区别最大的部分。

第二章      简介

在GUI编程中,当我们想要改变某个widget时,通常想要其它widget获悉这一改变通知。更常用的情景是,我们想要各种类型的对象间能够互相通信。比如,当用户点击了“关闭”按钮,我们可能希望它调用“关闭”功能把窗口关掉。

 

Older toolkits使用回调(callbacks)来达到这样的目的。回调是一个指向函数的指针,所以如果你希望一个处理函数通知你某些事件发生了,你可以传递一个指向其他函数的指针(回调)给它。这个处理函数将在适当的时候调用回调函数。回调函数有两个明显的缺点,第一,它们并不是类型安全,我们永远都不能确定调用者是否将通过正确的参数来调用“回调函数”;第二,回调函数与处理函数是紧耦合(strongly coupled)的,因为调用者必须知道应该在什么时候调用哪个回调函数。

 

                                          第三章      信号&槽

Qt使用了信号和槽来代替回调函数。当一个特定的事件发生时,信号会被发送出去。Qt的窗体部件(widget)拥有众多预先定义好的信号,当然,我们也可以创建窗体部件(widget)的子类来为它们添加我们需要的自定义信号。槽,则是对一个特定的信号进行的反馈。Qt的窗体部件(widget)同样拥有众多预先定义好的槽,但是通常的做法是,创建窗体部件(widget)的子类并添加自定义槽,以便对感兴趣的信号进行处理。

信号和槽机制是类型安全的(type-safe):一个信号的参数必须和接收槽的参数匹配。(槽的参数可以比它接收的信号的参数短,第十章的范例很好的解释了这一点。)由于这种参数匹配机制,编译器以帮助我们检查类型不匹配的签名。信号与槽是松耦合(loosely coupled)的:一个发出信号的类既不知道也不关心哪一个槽接收到这个信号。Qt的信号和槽机制保证了如果你将一个信号连接到一个槽上,槽会在正确的时间以号的参数被调用。信号与槽可以携带任意个、任意类型的参数。他们是完全的类型安全。

所有从QObject或者它的一个子类(比如:QWidget)继承的类都可以使用号与槽。对象中以这种方式通信:一个对象的状态发生了改变并发送信号,关心这个改变的另一对像接收到这个信号。发送信号的对象并不知道也不感兴趣什么对象接收它所发出的信号,这是真正的信息封装,保证了对象能被当作软件组件来使用。

槽能被用来接收信号,除此之外它们也是普通的成员函数。槽不知道是否有信号与它连接起来,正如对象不知道它发出信号是否会被接收一样。这样的机制确保了可以使用Qt创建一个个完全独立的组件。

你可以把你感兴趣的多个信号与一个个槽进行连接,也可以把一个信号与多个槽进行连接。甚至可以直接把一个信号连接到另一个信号(当第一个信号发送出去的时候,第二个信号紧接着被发送)。

就这样,信号与插槽建立了强大的组件编程机制。

 

                                      第四章      一个小例子

一个最小的C++类声明可能表示为:

class Counter
 {
       
 public:
     Counter() { m_value = 0; }
     int value() const { return m_value; }
     void setValue(int value);
 private:
     int m_value;
 };

 

一个小的QObject-based类可能表示为:

#include <QObject>
 class Counter : public QObject
 {
       
     Q_OBJECT
 public:
     Counter() { m_value = 0; }
     int value() const { return m_value; }
 public slots:
     void setValue(int value);
 signals:
     void valueChanged(int newValue);
 private:
     int m_value;
 };

 

QObject-based版本与C++版本一样,有相同的内部状态,并能提供公共方法来访问这个状态,除此之外,QObject-based版本还可以利用信号和槽来支持组件编程。这个类通过发送一个valueChanged()信号类可以告知外界它的状态已经改变,同时它还有一个槽可以用来接收其他对象发来的信号。

 

所有包含信号或槽的类在他们声明的顶端都必须写上Q_OBJECT,同样也必须直接或间

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值