日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt的信号槽机制介绍(含Qt5与Qt4的差异对比)

發布時間:2025/3/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt的信号槽机制介绍(含Qt5与Qt4的差异对比) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載地址:

https://blog.csdn.net/nicai888/article/details/51169520

?閑談:

? ? ? ? 熟悉Window下編程的小伙伴們,對其消息機制并不陌生, 話說:一切皆消息。它可以很方便實現不同窗體之間的通信,然而MFC庫將很多底層的消息都屏蔽了,盡管使用戶更加方便、簡易地處理消息,但也讓人特別是沒有Win32編程基的人感到迷茫,不是為何,筆者也是深受其害的。

? ? ? ? 詳細描述就不在此展開,感興趣的請查閱浩瀚如海的資料。。。


二 簡要介紹:

? ? ? ? 基于Qt開發,信號槽是確保正常通信的主要機制,特別是在多線程開發中,線程函數與界面的通信是無法直接進行的,會存在程序崩潰的問題,筆者在實際開發過程中也遇到過此問題,利用Qt的信號槽機制可以避免。

? ? ? ??所謂信號槽,類似于設計模式中的觀察者模式。當某一事件發生之后,比如,點擊了一下PushButton,它就會發出一個信號(signal)。需注意,這種發出是沒有目的的,類似廣播。如果有對象對這個信號感興趣,可以使用連接(connect)函數進行兩者之間的關聯,即:發送者發送信號(signal),接收者(感興趣對象)用自己的一個函數(稱之為槽(slot))來處理這個信號。同觀察者一樣,一個signal可以關聯(注冊)多個slot,當信號發出時,被連接的槽函數會自動被回調。

? ? ? ??connect()函數是信號槽機制的關鍵,下面介紹。


三 connect()函數:

? ? ? ? Qt5與Qt4中對connect()函數的實現有所差異。

? ? ? ??首先,看Qt4對其實現的定義:

[cpp]?view plaincopy
  • bool?connect(const?QObject?*,?const?char?*,??
  • ?????????????const?QObject?*,?const?char?*,??
  • ?????????????Qt::ConnectionType);??
  • ???
  • bool?connect(const?QObject?*,?const?QMetaMethod?&,??
  • ?????????????const?QObject?*,?const?QMetaMethod?&,??
  • ?????????????Qt::ConnectionType);??
  • ???
  • bool?connect(const?QObject?*,?const?char?*,??
  • ?????????????const?char?*,??
  • ?????????????Qt::ConnectionType)?const??
  • ? ? ? ?介紹定義1,參數分別為:發送者sender信號signal接收者receiver槽slot,最后一個基本不用。sender 類型是const QObject *,signal 的類型是const char *,receiver 類型是const QObject *,slot 類型是const char *。這個函數將 signal 和 slot 作為字符串處理。

    ? ? ? ??Qt4使用了SIGNAL和SLOT這兩個宏,將信號和槽的函數名轉換成了字符串。注意,不能將全局函數或者 Lambda 表達式傳入connect()。使用字符串導致了Qt4有以下缺點:一旦出現連接不成功的情況,Qt 4 是沒有編譯錯誤的(因為一切都是字符串,編譯期是不檢查字符串是否匹配),而是在運行時給出錯誤。這無疑會增加程序的不穩定性。

    ? ? ? ??下面,看Qt5對其實現的定義:

    [cpp]?view plaincopy
  • QMetaObject::Connection?connect(const?QObject?*,?const?char?*,??
  • ????????????????????????????????const?QObject?*,?const?char?*,??
  • ????????????????????????????????Qt::ConnectionType);??
  • ???
  • QMetaObject::Connection?connect(const?QObject?*,?const?QMetaMethod?&,??
  • ????????????????????????????????const?QObject?*,?const?QMetaMethod?&,??
  • ????????????????????????????????Qt::ConnectionType);??
  • ???
  • QMetaObject::Connection?connect(const?QObject?*,?const?char?*,??
  • ????????????????????????????????const?char?*,??
  • ????????????????????????????????Qt::ConnectionType)?const;??
  • ???
  • QMetaObject::Connection?connect(const?QObject?*,?PointerToMemberFunction,??
  • ????????????????????????????????const?QObject?*,?PointerToMemberFunction,??
  • ????????????????????????????????Qt::ConnectionType)??
  • ???
  • QMetaObject::Connection?connect(const?QObject?*,?PointerToMemberFunction,??
  • ????????????????????????????????Functor);??
  • ? ? ? ??第一個,sender 類型是const QObject *,signal 的類型是const char *,receiver 類型是const QObject *,slot 類型是const char *。這個函數將 signal 和 slot 作為字符串處理,與Qt4相同,應該是為了兼容性而予以保留的。

    ? ? ? ? 第二個,sender 和 receiver 同樣是const QObject *,但是 signal 和 slot 都是const QMetaMethod &。我們可以將每個函數看做是QMetaMethod的子類。因此,這種寫法可以使用QMetaMethod進行類型比對。

    ? ? ? ? 第三個,sender 同樣是const QObject *,signal 和 slot 同樣是const char *,但是卻缺少了 receiver。這個函數其實是將 this 指針作為 receiver,與Qt4相同,應該是為了兼容性而予以保留的。

    ? ? ? ??第四個,sender 和 receiver 也都存在,都是const QObject *,但是 signal 和 slot 類型則是PointerToMemberFunction。看這個名字就應該知道,這是指向成員函數的指針。

    ? ? ? ?第五個,前面兩個參數沒有什么不同,最后一個參數是Functor類型。這個類型可以接受?static 函數、全局函數以及 Lambda 表達式

    ? ? ? ?Qt5相比較于Qt4的優勢是添加了第4和第5種的重載形式,使得Qt可以在編譯期進行錯誤檢查,及早發現問題。


    在下一篇文章中將根據實際代碼簡要介紹信號槽的使用

    新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!

    總結

    以上是生活随笔為你收集整理的Qt的信号槽机制介绍(含Qt5与Qt4的差异对比)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。