0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

詳細(xì)介紹Qt的信號(hào)與槽交流機(jī)制

OpenCV學(xué)堂 ? 來(lái)源:OpenCV開(kāi)發(fā)者聯(lián)盟 ? 2023-02-21 09:35 ? 次閱讀

引言

前面講各種事件響應(yīng)的時(shí)候說(shuō)過(guò)一些關(guān)于信號(hào)與槽的綁定,實(shí)現(xiàn)相關(guān)的事件響應(yīng),但是并沒(méi)有深入跟詳細(xì)的介紹,之前的事件信號(hào)基本上都是QT的build-in信號(hào),響應(yīng)的槽函數(shù)基本上都是用戶自定義的函數(shù),本文將會(huì)詳細(xì)介紹Qt的信號(hào)與槽交流機(jī)制。

元對(duì)象系統(tǒng)

PyQT5中QGUI中當(dāng)用戶改動(dòng)一個(gè)QWidget的狀態(tài)時(shí),可以通過(guò)支持的信號(hào)觸發(fā)相關(guān)的槽函數(shù)完成動(dòng)作交互。其它的GUI庫(kù)多數(shù)都是通過(guò)Callback(回調(diào))實(shí)現(xiàn)消息傳遞與觸發(fā),QT的這種方法在更廣泛的層面是它底層的元數(shù)據(jù)對(duì)象系統(tǒng)(Meta-Object System )。元數(shù)據(jù)對(duì)象系統(tǒng)提供了信號(hào)與槽機(jī)制在不同的對(duì)象內(nèi)容交互數(shù)據(jù)與信息,元數(shù)據(jù)對(duì)象支持信號(hào)與槽機(jī)制主要依賴:

- 所有的QWidget對(duì)象都是QObject類都是元數(shù)據(jù)
- C++使用Q_OBJECT宏定義在私有變量中的類才是元數(shù)據(jù)
- 元數(shù)據(jù)對(duì)象編譯器會(huì)提供QObject類子類完成必要的代碼實(shí)現(xiàn)元對(duì)象特性

信號(hào)與槽

信號(hào)與槽機(jī)制中在GUI層面的信號(hào)主要是指靠用戶觸發(fā)特定事件產(chǎn)生,所以QWidget對(duì)象不同GUI組件預(yù)定義了大量的內(nèi)置信號(hào),開(kāi)發(fā)者在使用這些QWidget組件時(shí)只要把這些信號(hào)綁定到自定義的槽函數(shù)即可實(shí)現(xiàn)特定事件的響應(yīng)觸發(fā)特定方法。任意一個(gè)綁定信號(hào)的響應(yīng)函數(shù)都可以被稱為槽函數(shù),槽函數(shù)跟信號(hào)是松散耦合的關(guān)系,只有當(dāng)槽函數(shù)被鏈接到特定信號(hào)的時(shí)候它才會(huì)響應(yīng)特定事件。一個(gè)槽函數(shù)可以被鏈接到多個(gè)信號(hào)實(shí)現(xiàn)響應(yīng),同樣一個(gè)信號(hào)可以被不同的槽函數(shù)鏈接。信號(hào)與槽是QT編程架構(gòu)中最重要的組件之一。

信號(hào)

PyQT5中的信號(hào)分為兩種一種是build-in的信號(hào),主要是跟不同QWidget組件產(chǎn)生特定關(guān)聯(lián),比如valueChanged、toggled、clicked等這些信號(hào);另外一類信號(hào)是開(kāi)發(fā)者自定義信號(hào),這些信號(hào)可以幫助開(kāi)發(fā)者實(shí)現(xiàn)數(shù)據(jù)交互、特定界面刷新、在不同線程之間傳遞消息等等。builid-in的信號(hào)不需要開(kāi)發(fā)者激發(fā),開(kāi)發(fā)者只要綁定到特定的槽函數(shù)即可實(shí)現(xiàn)在動(dòng)作響應(yīng)時(shí)自定激發(fā);自定義信號(hào)必須通過(guò)顯式調(diào)用的方式激發(fā):

custom_signal.emit(parameters)

槽函數(shù)

任何一個(gè)正常的函數(shù)都可以成為槽函數(shù),類的實(shí)例方法通過(guò)信號(hào)鏈接成為槽函數(shù)之后被直接調(diào)用而不需要開(kāi)發(fā)者再初始類實(shí)例代碼。相比直接通過(guò)接口回調(diào)的方式,信號(hào)與槽架構(gòu)方式帶來(lái)了很大的靈活性,但是同時(shí)也會(huì)帶來(lái)更多的執(zhí)行調(diào)用時(shí)間,QT官方文檔指出這樣方法相比回調(diào)響應(yīng)過(guò)程會(huì)慢一點(diǎn)。

代碼演示部分

代碼演示部分只演示自定義信號(hào)跟自定義槽函數(shù)是如何工作的,build-in信號(hào)跟自定義槽函數(shù)在之前的文章中實(shí)際已經(jīng)演示了很多次,這里不在重復(fù)代碼演示。

數(shù)據(jù)類含有自定義信號(hào)

 1classMyTextData(QtCore.QObject):
 2fire_draw_text_signal=QtCore.pyqtSignal(str)
 3
 4def__init__(self):
 5super(MyTextData,self).__init__()
 6print("createmytext...")
 7self.text_content="OpenCV開(kāi)發(fā)者聯(lián)盟"
 8
 9deftext_changed(self,text):
10self.text_content=text
11self.fire_draw_text_signal.emit(self.text_content)
初始化,綁定自定義信號(hào)與自定義槽函數(shù)
1#初始化自定義數(shù)據(jù)類
2self.my_data=MyTextData()
3self.my_data.fire_draw_text_signal.connect(self.show_text)
4self.my_data.text_changed("自定義信號(hào)演示")
自定義槽函數(shù)
 1defshow_text(self,text):
 2painter=QtGui.QPainter(self.label.pixmap())
 3pen=QtGui.QPen(QtCore.Qt.green)
 4painter.setPen(pen)
 5font=QtGui.QFont()
 6font.setBold(True)
 7font.setPointSizeF(24)
 8painter.setFont(font)
 9painter.drawText(QtCore.QPoint(20,50),"OpenCV演示-"+text)
10painter.end()
觸發(fā)與調(diào)用
 1defon_update_gray(self):
 2image=cv.imread("images/test5.png")
 3gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
 4dst=cv.cvtColor(gray,cv.COLOR_GRAY2RGB)
 5height,width,channel=dst.shape
 6bytesPerLine=3*width
 7img=QtGui.QImage(dst.data,width,height,bytesPerLine,QtGui.QImage.Format_RGB888)
 8pixmap=QtGui.QPixmap(img)
 9pix=pixmap.scaled(QtCore.QSize(620,500),QtCore.Qt.KeepAspectRatio)
10self.label.setPixmap(pix)
11self.my_data.text_changed("圖像灰度化")
會(huì)自動(dòng)繪制指定文本到QLabel標(biāo)簽的圖像上,代碼運(yùn)行結(jié)果如下:

41de6f62-b131-11ed-bfe3-dac502259ad0.png

42074ff4-b131-11ed-bfe3-dac502259ad0.png

42307f32-b131-11ed-bfe3-dac502259ad0.png






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • GUI
    GUI
    +關(guān)注

    關(guān)注

    3

    文章

    641

    瀏覽量

    39493
  • 回調(diào)函數(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    87

    瀏覽量

    11530
  • pyqt5
    +關(guān)注

    關(guān)注

    0

    文章

    25

    瀏覽量

    3392

原文標(biāo)題:PyQT5開(kāi)發(fā)之自定義信號(hào)與槽函數(shù)詳解

文章出處:【微信號(hào):CVSCHOOL,微信公眾號(hào):OpenCV學(xué)堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Qt信號(hào)機(jī)制(一)

    一. 簡(jiǎn)介就我個(gè)人來(lái)理解,信號(hào)機(jī)制與Windows下消息機(jī)制類似,消息機(jī)制是基于回調(diào)函數(shù),Qt
    發(fā)表于 11-07 15:06

    Qt信號(hào)例子(二)

    ))); } //實(shí)現(xiàn)用于接受pb點(diǎn)擊信號(hào)void MyMainWindows::SlotTest(){label->setText("clicked");//發(fā)送自定義的信號(hào),請(qǐng)注意信號(hào)
    發(fā)表于 11-07 15:13

    QT自動(dòng)鏈接信號(hào)機(jī)制

    name中的信號(hào)signal name和這個(gè)void on__()鏈接起來(lái)。這是QT不需要connect語(yǔ)句就可以自動(dòng)鏈接信號(hào)
    發(fā)表于 11-13 09:17

    【NanoPi M1 Plus試用體驗(yàn)】【結(jié)項(xiàng)】-基于Qt環(huán)境下的FTP服務(wù)工具開(kāi)發(fā)

    Designer進(jìn)行界面設(shè)計(jì),由一個(gè)主界面和三個(gè)子界面組成。(3)添加代碼 建立信號(hào)函數(shù)映射機(jī)制信號(hào)
    發(fā)表于 06-08 14:51

    請(qǐng)問(wèn)Qt編程中信號(hào)信號(hào)處理程序的使用方法?

      信號(hào)作為Qt的和新機(jī)制,在Qt編程中有著非常廣泛的應(yīng)用。  事實(shí)上,我們?cè)?b class='flag-5'>Qt開(kāi)發(fā)中,要
    發(fā)表于 11-20 08:03

    信號(hào)是如何實(shí)現(xiàn)連接的呢

    1.的連接過(guò)程分析Unix Signal產(chǎn)生者(鍵盤) --> 綁定[signal(id,某函數(shù)())] --> 接受者(“.c文件中的函數(shù)處理”)Qt 信號(hào)產(chǎn)生者(按鈕等
    發(fā)表于 01-18 09:48

    基于Qt的遙控式設(shè)備控制的設(shè)計(jì)與實(shí)現(xiàn)

    采用Qt 的一次編寫(xiě)多處編譯運(yùn)行機(jī)制和其強(qiáng)大的信號(hào)機(jī)制,首先基于Qt 設(shè)計(jì)了遙控式控制設(shè)備的
    發(fā)表于 08-17 08:37 ?14次下載

    Qt5主窗體的詳細(xì)中文資料免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是Qt5主窗體的詳細(xì)中文資料免費(fèi)下載內(nèi)容包括了:Qt 5主窗體構(gòu)成,Qt
    發(fā)表于 08-01 08:00 ?0次下載
    <b class='flag-5'>Qt</b>5主窗體的<b class='flag-5'>詳細(xì)</b>中文資料免費(fèi)下載

    Qt5位置相關(guān)函數(shù)及圖形與圖片的詳細(xì)資料免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是Qt5位置相關(guān)函數(shù)及圖形與圖片的詳細(xì)資料免費(fèi)下載內(nèi)容包括了:Qt 5位置相關(guān)函數(shù),
    發(fā)表于 08-01 08:00 ?0次下載
    <b class='flag-5'>Qt</b>5位置相關(guān)函數(shù)及圖形與圖片的<b class='flag-5'>詳細(xì)</b>資料免費(fèi)下載

    Qt Creator的詳細(xì)資料簡(jiǎn)介

    本文檔的主要內(nèi)容詳細(xì)介紹的是Qt Creator的詳細(xì)資料簡(jiǎn)介包括了:1 Qt Creator的下載和安裝2
    發(fā)表于 12-26 16:59 ?33次下載
    <b class='flag-5'>Qt</b> Creator的<b class='flag-5'>詳細(xì)</b>資料簡(jiǎn)介

    Qt5 學(xué)習(xí)之路及嵌入式開(kāi)發(fā)教程3:設(shè)計(jì)器Designer實(shí)現(xiàn)信號(hào)例子

    Qt5 學(xué)習(xí)之路及嵌入式開(kāi)發(fā)教程3:設(shè)計(jì)器Designer實(shí)現(xiàn)信號(hào)例子一、界面設(shè)計(jì)1、單擊運(yùn)行Qt Creator,新建項(xiàng)目選擇,出現(xiàn)“項(xiàng)目介紹
    發(fā)表于 11-03 19:06 ?1次下載
    <b class='flag-5'>Qt</b>5 學(xué)習(xí)之路及嵌入式開(kāi)發(fā)教程3:設(shè)計(jì)器Designer實(shí)現(xiàn)<b class='flag-5'>信號(hào)</b><b class='flag-5'>槽</b>例子

    Qt編程基礎(chǔ)之信號(hào)機(jī)制

    在使用信號(hào)的類中,必須在類的定義中加入宏Q_OBJECT。當(dāng)一個(gè)信號(hào)被發(fā)射時(shí),與其關(guān)聯(lián)的函數(shù)會(huì)被立即執(zhí)行,就像正常調(diào)用一個(gè)函數(shù)一樣。只有當(dāng)信號(hào)
    的頭像 發(fā)表于 09-06 13:01 ?1048次閱讀

    一文詳解Qt信號(hào)函數(shù)機(jī)制

    信號(hào)用于多個(gè)對(duì)象之間的通信。信號(hào)機(jī)制Qt的核心特性,也是
    的頭像 發(fā)表于 02-07 09:14 ?3063次閱讀

    Qt“懶人寫(xiě)法”之一鍵破“

    在《Qt信號(hào)函數(shù)機(jī)制,此篇足矣》一文中已經(jīng)描述了Qt信號(hào)
    的頭像 發(fā)表于 02-09 17:23 ?925次閱讀

    Qt“靈魂”之Meta-Object系統(tǒng)

    Meta-Object即是Qt的元對(duì)象系統(tǒng),下文都以元對(duì)象系統(tǒng)進(jìn)行描述。在Qt中,具有標(biāo)志性特征的則是信號(hào)函數(shù)機(jī)制,該
    的頭像 發(fā)表于 02-10 13:50 ?1784次閱讀