QT5 信号槽

信号槽是 Qt 框架引以为豪的机制之一。为了体验一下信号槽的使用,我们以一段简单的代码说明:


#include 

#include 

int main(int argc, char *argv[])

{

   QApplication app(argc, argv);

   QPushButton button("&Quit");

   QObject::connect(&button,&QPushButton::clicked,&QApplication::quit);

   button.show();

   return app.exec();

}

 

注意:我们的代码是以 Qt 5 为主线,这意味着,有的代码放在 Qt 4 上是不能编译的

 

在 Qt 5 中,QObject::connect() 有五个重载:

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

这是我们最常用的形式。connect() 一般会使用前面四个参数,第一个是发出信号的对象,第二个是发送对象发出的信号,第三个是接收信号的对象,第四个是接收对象在接收到信号之后所需要调用的函数。也就是说,当 sender 发出了 signal 信号之后,会自动调用 receiver 的 slot 函数。
第一个,sender 类型是 const QObject *,signal 的类型是 const char *,receiver 类型是 const QObject *,slot 类型是 const char *。这个函数将 signal 和 slot 作为字符串处理。

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

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

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

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

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

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

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

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


将信号与槽连接起来时,QObject::connect()的最后一个参数将指定连接类型:

Qt::DirectConnection:直接连接意味着槽函数将在信号发出的线程直接调用

Qt::QueuedConnection:队列连接意味着向接受者所在线程发送一个事件,该线程的事件循环将获得这个事件,然后之后的某个时刻调用槽函数

Qt::BlockingQueuedConnection:阻塞的队列连接就像队列连接,但是发送者线程将会阻塞,直到接受者所在线程的事件循环获得这个事件,槽函数被调用之后,函数才会返回

Qt::AutoConnection:自动连接(默认)意味着如果接受者所在线程就是当前线程,则使用直接连接;否则将使用队列连接


我们使用 Qt 的信号槽机制

点击(此处)折叠或打开

  1. #include <QObject> 
  2.  
  3. ////////// newspaper.
  4. class Newspaper : public QObject 
  5. { 
  6.     Q_OBJECT 
  7. public: 
  8.     Newspaper(const QString & name) : 
  9.         m_name(name) 
  10.     { 
  11.     } 
  12.  
  13.     void send() 
  14.     { 
  15.         emit newPaper(m_name); 
  16.     } 
  17.  
  18. signals: 
  19.     void newPaper(const QString &name); 
  20.  
  21. private: 
  22.     QString m_name; 
  23. }; 
  24.  
  25. ////////// reader.
  26. #include <QObject> 
  27. #include <QDebug> 
  28.  
  29. class Reader : public QObject 
  30. { 
  31.     Q_OBJECT 
  32. public: 
  33.     Reader() {} 
  34.  
  35.     void receiveNewspaper(const QString & name) 
  36.     { 
  37.         qDebug() << "Receives Newspaper: " << name; 
  38.     } 
  39. }; 
  40.  
  41. ////////// main.cpp 
  42. #include <QCoreApplication> 
  43.  
  44. #include "newspaper.h" 
  45. #include "reader.h" 
  46.  
  47. int main(int argc, char *argv[]) 
  48. { 
  49.     QCoreApplication app(argc, argv); 
  50.  
  51.     Newspaper newspaper("Newspaper A"); 
  52.     Reader reader; 
  53.     QObject::connect(&newspaper, &Newspaper::newPaper, 
  54.                      &reader, &Reader::receiveNewspaper); 
  55.     newspaper.send(); 
  56.  
  57.     return app.exec(); 
  58. }

Qt 5 中,任何成员函数、static 函数、全局函数和 Lambda 表达式都可以作为槽函数。


网址:http://blog.chinaunix.net/uid-24219701-id-4042043.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值