Qt的信號與槽(一)
- 1.信號和槽的基本認識
- 2.connect
- 3.關閉窗口的按鈕
- 4.函數的根源
- 5.形參和實參的類型
🌟hello,各位讀者大大們你們好呀🌟🌟
🚀🚀系列專欄:【Qt的學習】
📝📝本篇內容:信號和槽的基本認識;connect;關閉窗口的按鈕;函數的根源;形參和實參的類型
????上一篇:Qt中的坐標系
💖💖作者簡介:軒情吖,請多多指教(>> ????? ) ??-
1.信號和槽的基本認識
在之前的學習中,我們已經簡單的了解了信號和槽相關的知識,接下來就是詳細的將這一方面的知識展示講一講。
首先我們在Linux中也有信號的概念,雖然不同相同的概念,但有相似之處
在Linux中我們談到信號,涉及到三個要素
①信號源:誰發出的信號
②信號類型:哪種類別的信號
③信號的處理方式:注冊信號處理函數,在信號被觸發的時候自動調用執行
在Qt中我們談到信號,也是涉及到三個要素
①信號源:由哪個控件發出的信號
②信號類型:用戶進行不同的操作,就會觸發不同的信號
③信號的處理方式(也就是槽):處理信號的函數,通過connect函數,把信號和槽關聯起來,這個槽函數其實是一個回調函數,當信號觸發了,Qt就會自動執行槽函數
并且我們的信號在觸發前,一定是把處理函數準備好了,因此我們一定是需要先將信號和槽進行關聯到一起后,再觸發信號,否則Qt就不知道怎么處理信號了(直接錯過了)
2.connect
我們之前講過,connect函數是QObject提供的靜態函數,我們可以通過它進行關聯信號和槽,但是我們為什么能直接在Widget的構造函數中使用呢?
這主要是因為我們的Widget繼承于QWidget,QWidget又繼承于QObject
在Qt中很多類都存在一定的繼承關系,QObject是大部分類的祖宗
了解完這個,我們來詳細看看我們的connect的一些情況
我們先來看看它的參數情況
第一個參數:這個參數的作用是哪個控件發出的信號
第二個參數:這個參數的作用是什么類型的信號
第三個參數:這個參數的作用是哪個控件來負責處理(槽是哪個類提供的)
第四個參數:這個參數的作用是處理信號的控件提供的成員函數
第五個參數:暫時不關心,有默認參數
3.關閉窗口的按鈕
下面寫了一個功能:點擊按鈕后,關閉窗口
接下來我們詳細談談這份代碼當中的一些細節
首先我們來說說第二個參數,這個參數我們在寫代碼時,會自動補充出一個比較相似的參數,這個就需要我們注意,不要選錯了。第一個click是一個動詞,它是一個slot(槽)函數,功能就是調用的時候點擊一下按鈕,它前面的圖標是一個也像一個“槽”,可以通過這個辨別。第二個clicked是一個過去分詞,點擊完后的狀態,這個才是我們需要的信號函數,它前面的圖標也像一個wifi圖標,代表了這個是個信號函數。
并且我們的connect要求第一個參數和第二個參數要匹配,第一個參數的類型是QPushButton*類型的,第二個參數也必須是QPushButton內置的信號(也可以是繼承父類的信號)
而我們的close槽函數,是QWidget內置的槽函數,然后Widget又繼承了QWidget的槽函數,因此不需要我們操心實現,只需要知道功能是關閉當前的窗口
4.函數的根源
現在雖然解決了使用問題,但是我們怎么知道他們從何而來呢?特別是內置的槽函數和信號,就以按鈕為例,你怎么知道它有個內置信號叫做clicked()?答案是查文檔
但是其實我們在里面再怎么翻找,也找不到clicked。那怎么辦呢?其實在圖片中已經給出答案了,去它的父類中去找找
abstract是抽象的意思,也就是抽象按鈕,之所以會有這樣一個類,是因為Qt中會提供好幾種按鈕,這些按鈕之間存在一些”共性”內容
就把這些共性的東西,提取出來,放到了QAbstractButton類里面
繼續點擊我們的clicked信號函數就可以看到下面的內容
翻譯:當按鈕被激活時(即,當鼠標光標位于按鈕內時按下然后釋放)、鍵入快捷鍵或調用 click() 或 animateClick() 時,會發出此信號。值得注意的是,如果您調用 setDown()、setChecked() 或 toggle(),則不會發出此信號。
我們在看文檔的時候主要關注的是信號的發送時機,即對控件進行了什么操作產生的信號
5.形參和實參的類型
不知道大家在使用connect的時候注意到一個點,就是它的第二個和第四個參數的類型都是char*類型的,但是我們傳遞的參數都是函數指針類型的,并且即使是函數指針類型的,也會有問題,因為兩個實參的函數指針類型也是不一樣。
C++是不允許兩個不同類型之間進行賦值的
其實這個是舊版本的connect聲明,現在新版的已經不是這樣了,并且我們在舊版時,需要給信號參數傳參時需要帶上SIGNAL宏,給槽參數傳參時需要帶上SLOT宏,這樣才能將參數轉換成char*類型
現在的Qt5就不需要那么麻煩,connect有了重載版本,第二個和第四個參數變成了泛型類型,可以接受任何類型的函數指針
在圖中所說的出自同一個類的意思是,參數二和參數四的函數指針是參數一和參數三類的成員函數
🌸🌸Qt的信號與槽(一)大概就講到這里啦,博主后續會繼續更新更多Qt的相關知識,干貨滿滿,如果覺得博主寫的還不錯的話,希望各位小伙伴不要吝嗇手中的三連哦!如有小伙伴需要Qt的安裝包可以私信我,你們的支持是博主堅持創作的動力!💪💪