引言
前面講各種事件響應的時候說過一些關于信號與槽的綁定,實現相關的事件響應,但是并沒有深入跟詳細的介紹,之前的事件信號基本上都是QT的build-in信號,響應的槽函數基本上都是用戶自定義的函數,本文將會詳細介紹Qt的信號與槽交流機制。
元對象系統
PyQT5中QGUI中當用戶改動一個QWidget的狀態時,可以通過支持的信號觸發相關的槽函數完成動作交互。其它的GUI庫多數都是通過Callback(回調)實現消息傳遞與觸發,QT的這種方法在更廣泛的層面是它底層的元數據對象系統(Meta-Object System )。元數據對象系統提供了信號與槽機制在不同的對象內容交互數據與信息,元數據對象支持信號與槽機制主要依賴:
- 所有的QWidget對象都是QObject類都是元數據 - C++使用Q_OBJECT宏定義在私有變量中的類才是元數據 - 元數據對象編譯器會提供QObject類子類完成必要的代碼實現元對象特性
信號與槽
信號與槽機制中在GUI層面的信號主要是指靠用戶觸發特定事件產生,所以QWidget對象不同GUI組件預定義了大量的內置信號,開發者在使用這些QWidget組件時只要把這些信號綁定到自定義的槽函數即可實現特定事件的響應觸發特定方法。任意一個綁定信號的響應函數都可以被稱為槽函數,槽函數跟信號是松散耦合的關系,只有當槽函數被鏈接到特定信號的時候它才會響應特定事件。一個槽函數可以被鏈接到多個信號實現響應,同樣一個信號可以被不同的槽函數鏈接。信號與槽是QT編程架構中最重要的組件之一。
信號
PyQT5中的信號分為兩種一種是build-in的信號,主要是跟不同QWidget組件產生特定關聯,比如valueChanged、toggled、clicked等這些信號;另外一類信號是開發者自定義信號,這些信號可以幫助開發者實現數據交互、特定界面刷新、在不同線程之間傳遞消息等等。builid-in的信號不需要開發者激發,開發者只要綁定到特定的槽函數即可實現在動作響應時自定激發;自定義信號必須通過顯式調用的方式激發:
custom_signal.emit(parameters)
槽函數
任何一個正常的函數都可以成為槽函數,類的實例方法通過信號鏈接成為槽函數之后被直接調用而不需要開發者再初始類實例代碼。相比直接通過接口回調的方式,信號與槽架構方式帶來了很大的靈活性,但是同時也會帶來更多的執行調用時間,QT官方文檔指出這樣方法相比回調響應過程會慢一點。
代碼演示部分
代碼演示部分只演示自定義信號跟自定義槽函數是如何工作的,build-in信號跟自定義槽函數在之前的文章中實際已經演示了很多次,這里不在重復代碼演示。
數據類含有自定義信號
1classMyTextData(QtCore.QObject): 2fire_draw_text_signal=QtCore.pyqtSignal(str) 3 4def__init__(self): 5super(MyTextData,self).__init__() 6print("createmytext...") 7self.text_content="OpenCV開發者聯盟" 8 9deftext_changed(self,text): 10self.text_content=text 11self.fire_draw_text_signal.emit(self.text_content)初始化,綁定自定義信號與自定義槽函數
1#初始化自定義數據類 2self.my_data=MyTextData() 3self.my_data.fire_draw_text_signal.connect(self.show_text) 4self.my_data.text_changed("自定義信號演示")自定義槽函數
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()觸發與調用
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("圖像灰度化")會自動繪制指定文本到QLabel標簽的圖像上,代碼運行結果如下:
審核編輯:劉清
-
GUI
+關注
關注
3文章
661瀏覽量
39715 -
回調函數
+關注
關注
0文章
87瀏覽量
11573 -
pyqt5
+關注
關注
0文章
25瀏覽量
3403
原文標題:PyQT5開發之自定義信號與槽函數詳解
文章出處:【微信號:CVSCHOOL,微信公眾號:OpenCV學堂】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論