搜索
Table_bottom

标签云
Table_bottom

分类
Table_bottom

声明
文章若未特別註明,皆採用 知识共享许可协议 請自覺遵守
Table_bottom

存档
Table_bottom

匆匆过客
32933
Table_bottom

功能
Table_bottom

Qt中鏈接信號和槽的方法

人云E云 posted @ 2015年7月03日 16:07 in 信息技術 with tags Coding Qt , 638 阅读

最近又在用Qt寫東西,順便翻了翻Qt的文檔,發現鏈接信號和槽的方法有不少,Qt5和C++11的組合也帶來了一些不小變化。

所以有此一篇文章,對其稍加總結。

文中約定

  1. 使用“鏈接”這一術語而非“連接”
  2. 默認所有對象都(直接或間接)繼承了QObject

Qt對信號和槽的鏈接有如下規則:

  1. 使用信號和槽機制需要在類聲明中加入Q_OBJECT宏
  2. 可以鏈接信號和槽
  3. 可以鏈接信號和信號
  4. 同一個信號或槽可鏈接或被鏈接多次
  5. 信號比槽中多出的參數會被忽略
  6. 鏈接可以通過disconnect斷開

其鏈接方法如下:

  1.  connect( 信號源, SIGNAL( 信號( 參數表 ) ), 接收者, SLOT( 槽( 參數表 ) ) )
    • 目前最爲常用的一個方法,是static函數
    • 在任何繼承了QObject且寫有Q_OBJECT宏的類中使用
    • 其中SIGNAL()和SLOT()均爲宏
    • 參數表中只需()按順序寫出參數類型
    • 其原型爲:
      • bool QObject::connect(const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection)
      • QMetaObject::Connection QObject::connect(const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection)
    • 其還有幾個重載,常用的爲:
      • 接收者爲當前對象時可不寫接收者
  2. connect( 信號源, &信號源類::信號, 接收者, &接收者類::信號 )
    • 需要Qt5
    • 編譯器會檢查信號和槽的參數類型是否匹配
    • 不支持槽使用默認參數來填補信號中不足的參數
    • 其原型爲:
      QMetaObject::Connection QObject::connect(const QObject * sender, PointerToMemberFunction signal, const QObject * receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection)
  3. connect( 信號源, &信號源類::信號, lambda表達式 )
    • 需要編譯器支持C++11且需要Qt5
    • 若編譯器不支持可變參數模板,則最多允許信號攜帶6個參數
    • 其原型爲:
      QMetaObject::Connection QObject::connect(const QObject * sender, PointerToMemberFunction signal, Functor functor)

Qt5和Q4中,connect函數幾個主要不同點在於:

  1. Qt5中返回值類型爲QMetaObject::Connection,而Qt4中爲bool
  2. Qt5中支持槽爲lambda表達式,而Qt4中不支持

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter