信号槽系统

来源:互联网 发布:淘宝px是什么意思 编辑:程序博客网 时间:2024/06/05 08:59

信号槽:一个对象(sender)上由于某件事情的发生而广播一个信号(signal),通过connect函数进行连接,另一个对象(receiver)可以接收这个信号并调用一个槽函数(slot)作为响应。


connect函数的基本形式:QObjectconnect(sender,signal,receiver,slot)


QT5中QObject : : connect()的五个重载如下:

(1)QMetaObject::Connection connect(const QObject *, const char *,
                                const QObject *, const char *,
                                Qt::ConnectionType);


(2)QMetaObject::Connection connect(const QObject *, const QMetaMethod &,
                                const QObject *, const QMetaMethod &,
                                Qt::ConnectionType);


(3)QMetaObject::Connection connect(const QObject *, const char *,
                                const char *,
                                Qt::ConnectionType) const;


(4)QMetaObject::Connection connect(const QObject *, PointerToMemberFunction,
                                const QObject *, PointerToMemberFunction,
                                Qt::ConnectionType)


(5)QMetaObject::Connection connect(const QObject *, PointerToMemberFunction,
                                Functor);


以connect函数的基本形式分析以上五种重载:

1.对于第一二四种重载,sender和receiver都是QObject,区别在于信号函数和槽函数有三种类型:const char *、QMetaMethod &和PointerToMemberFunction。

其中PointerToMemberFunctio指的是信号、槽函数的指针,比较容易理解。

QMetaMethod根据文章作者的解释,可以看作QMetaMethod的子类,目前我没有学习到相关内容,暂且理解为某种特殊的函数。

const char*是字符串,根据作者的解释,使用SIGNAL(信号函数名)和SLOT(槽函数名)的宏,可以将其转化为字符串。

2.对于第三种重载,相较于第一种,缺少了receiver,此处默认将this指针当作receiver。

3.对于第五种重载,Functor指的是static函数、全局函数和Lambda表达式(C++11)。


注意带参数的信号槽函数,实际上是信号函数将参数传给了槽函数,因此槽函数的参数数目不能够多于信号函数。


除了QT内置的组件已经实现的信号,对于自定义类的自定义信号槽使用如下:

1.sender类的public成员中,额外定义signals成员,signals成员的声明方式等同于普通的函数,但是不需要也不能有具体的实现。

2.通常在sender类的其他成员函数中发射该信号,语法为:emit 函数名。

3.通过connect进行连接工作。


关于lambda表达式:

http://www.cnblogs.com/haippy/archive/2013/05/31/3111560.html

0 0