免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1055 | 回复: 0
打印 上一主题 下一主题

QT Embedded二三事之QObject的signal/slot [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-24 00:38 |只看该作者 |倒序浏览

2. signal/slot    
   signal/slot机制是QT最具特色的特性。signal/slot巧妙的简单的实现了面向对象编程中经常使用的观察者模式(observer,或称为消息预定模式)。同时也封装了callback机制,一定程度上保证了callback函数的类型安全。
 从实现上来看,signal/slot需要QMetaObject和moc编译器的支持。signal和slot实际上是两种类函数,分别需要在类函数声明前面加signals和slots两个宏。
 以QButton的一个signals和slots为例说明实现过程:
class Q_EXPORT QButton : public QWidget
{
    Q_OBJECT
 .........
 
signals:
    void        pressed();
 ................
public slots:
    void        animateClick();
 (1)signal/slot机制需要增加Q_OBJECT声明,signal/slot是元对象信息,需要QMetaObject的支持。
 (2)signals、slots、emit都是宏,从定义上看,都是空值。对C++编译器编译没有任何影响。实际上,这三个宏都是给QT的moc编译器使用的。moc编译器会对标记为signals和slots的函数编号,方便的实现(编号,函数名字,函数地址)三者之间的转换。同时实现了标记为signals的函数。因此pressed()函数的是由moc编译器实现的,不需要用户实现,具体内容在moc_qbutton.cpp中。
 (3)connect/disconnect
 这两个函数的定义如下:
QObject::connect( const QObject *sender,        const char *signal,               const QObject *receiver, const char *member )
QObject::disconnect( const QObject *sender,   const char *signal,                  const QObject *receiver, const char *member )
 QMetaObject中会为每一个signal建立一个QConnectList列表,记录着连接到这个signal的所有receiver和其slot函数。        connect就是在QConnectList中增加一项,让sender的QMetaObject记住。disconnect的作用相反。
 (4)emit pressed()
    emit是一个宏,但是一个空值,因此emit pressed()==pressed()。pressed()是由moc编译器实现的。        QButton::pressed()就是把通过QConnectList把所连接的receiver和其member函数找出来,然后按先后顺序调用receiver->member(),由于是一个list,所以是先连接的slot先执行。这与Observer模式中的实现是一致的。
 从上面的分析来看,signal/slot是同步直接调用。实现有些复杂,效率上比callback函数也慢一些,但是对于面向对象编程来说,非常符合对象之间低耦合的思想,减少了对象之间的依赖。使用起来也灵活。函数接口也可以任意组合。的确是QT的特色。
    使用过程中,也需要注意如下几点:
 (1)QT的signal和unix操作系统的signal是不同的,unix的signal是进程之间的一种通讯方式,QT的signal是对象之间的一种消息传递方式,不是一个层面的概念。
 (2)slot函数的返回值是没有意义的,signal函数是由moc编译器实现的,从具体实现来看,不关心slot函数的返回值。
 (3)根据目前的实现,slot函数的被执行是有顺序的,但是这要依赖于目前的实现,以后或许会变
 (4)signal/slot和(public,protected,private)没有冲突,private的函数也可以是signal/slot
 (4)slot函数可以是虚函数吗?
 (5)signal函数可以是虚函数吗?
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/92787/showart_1840430.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP