信号与槽

 1 QMetaObject::Connection connect(const QObject *, const char *,
 2                                 const QObject *, const char *,
 3                                 Qt::ConnectionType);
 4  
 5 QMetaObject::Connection connect(const QObject *, const QMetaMethod &,
 6                                 const QObject *, const QMetaMethod &,
 7                                 Qt::ConnectionType);
 8  
 9 QMetaObject::Connection connect(const QObject *, const char *,
10                                 const char *,
11                                 Qt::ConnectionType) const;
12  
13 QMetaObject::Connection connect(const QObject *, PointerToMemberFunction,
14                                 const QObject *, PointerToMemberFunction,
15                                 Qt::ConnectionType)
16  
17 QMetaObject::Connection connect(const QObject *, PointerToMemberFunction,
18                                 Functor);

以上为qt5中connect的5个override

    static QMetaObject::Connection connect(const QObject *sender, const char *signal,
                        const QObject *receiver, const char *member, Qt::ConnectionType = Qt::AutoConnection);

    static QMetaObject::Connection connect(const QObject *sender, const QMetaMethod &signal,
                        const QObject *receiver, const QMetaMethod &method,
                        Qt::ConnectionType type = Qt::AutoConnection);

    inline QMetaObject::Connection connect(const QObject *sender, const char *signal,
                        const char *member, Qt::ConnectionType type = Qt::AutoConnection) const;

#ifdef Q_QDOC
    static QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection);
    static QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor);
    static QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, const QObject *context, Functor functor, Qt::ConnectionType type = Qt::AutoConnection);
View Code

这是我qt工程里的connect的declaration

一般形式:

  1. connect(sender,   signal,
  2.         receiver, slot);

这是我们最常用的形式。connect() 一般会使用前面四个参数,第一个是发出信号的对象,第二个是发送对象发出的信号,第三个是接收信号的对象,第四个是接收对象在接收到信号之后所需要调用的函数。也就是说,当 sender 发出了 signal 信号之后,会自动调用 receiver 的 slot 函数。

 

这是最常用的形式,我们可以套用这个形式去分析上面给出的五个重载。

第一个,sender 类型是 const QObject *,signal 的类型是 const char *,receiver 类型是 const QObject *,slot 类型是 const char *。这个函数将 signal 和 slot 作为字符串处理。

第二个,sender 和 receiver 同样是 const QObject *,但是 signal 和 slot 都是 const QMetaMethod &。我们可以将每个函数看做是 QMetaMethod 的子类。因此,这种写法可以使用 QMetaMethod 进行类型比对。

第三个,sender 同样是 const QObject *,signal 和 slot 同样是 const char *,但是却缺少了 receiver。这个函数其实是将 this 指针作为 receiver。

第四个,sender 和 receiver 也都存在,都是 const QObject *,但是 signal 和 slot 类型则是 PointerToMemberFunction。看这个名字就应该知道,这是指向成员函数的指针。

第五个,前面两个参数没有什么不同,最后一个参数是 Functor 类型。这个类型可以接受 static 函数、全局函数以及 Lambda 表达式。

 

信号槽要求信号和槽的参数一致,所谓一致,是参数类型一致,槽函数的parameter可以比信号少,但绝不可以比信号多

EG:

 

1       connect(timer,SIGNAL(timeout()),this,SLOT(handleTimerUpdated()));

 

SIGNAL 和SLOT是两个宏函数,他们将其参数,即将信号和槽函数转换为相应的字符串

当定时器溢出即执行槽函数

 

 

REF: http://www.qter.org/thread-622-1-1.html

posted @ 2018-03-13 21:38  katachi  阅读(149)  评论(0)    收藏  举报