在Qt中,如何響應動作。這會用到Qt的信號和槽機制。 我的理解:它和Win32程式的消息響應機制差不多吧。 信號,簡單理解就是:當我們點擊一個按鈕時,這個按鈕自身就會產生一個叫作"單擊"的信息,這個信息說明瞭剛剛我們點擊了這一個按鈕。產生的這個信息就相當於自己發射了一個信號,表明一個用戶動作已經發生 ...
在Qt中,如何響應動作。這會用到Qt的信號和槽機制。
我的理解:它和Win32程式的消息響應機制差不多吧。
信號,簡單理解就是:當我們點擊一個按鈕時,這個按鈕自身就會產生一個叫作"單擊"的信息,這個信息說明瞭剛剛我們點擊了這一個按鈕。產生的這個信息就相當於自己發射了一個信號,表明一個用戶動作已經發生了或者是一個狀態已經改變了。這就是信號(signal)。
槽,可以理解為:當這個按鈕發射了這個信號之後,假如有一個"監聽員"發現了這個信號,它會馬上做出響應,做相應的動作。這個動作一般就是指執行一個或多個函數。這些就是槽(slot)。
要使得槽能夠響應指定的信號,就需要把信號和指定的槽連接起來。連接之後,只要出現了這個信號,槽就會自動執行。
接下來看一下以下代碼:
第7行:創建一個QPushButton對象,頭文件<QPushButton>
用到的函數:QPushButton::QPushButton ( const QString & text, QWidget * parent = 0 )
函數的說明:構造一個文本為text的按鈕,parent是它的父視窗,預設為0。
第9行:將信號(clicked())和槽(quit())連接。
用到的函數:bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionTypetype = Qt::AutoConnection )
函數的說明:創建一個指定類型(type)的連接,指定發送方對象和方法,和接收方對象和方法。如果連接成功,返回true,否則將返回false。
參數中,type已經有預設值,現在來說不需要自己指定。
sender是發射信號的對象,signal是這個對象發射的具體的信號,需要使用SIGNAL()巨集。
receiver是接收信號的對象,method是槽,也就是響應的函數,需要使用SLOT()巨集。
SIGNAL()和SLOT()是Qt中定義的巨集,這兩個巨集會把它們的參數轉換成相應的字元串。
兩個巨集的參數都是不帶參數名的函數名(參數名是指函數參數中的變數名,不是指參數類型,這其實也可以說成這兩個巨集的參數就是一個比較類似函數指針的類型的東西吧?只不過沒有返回值和返回值後面跟著的(*)這個東西而已)。
sender與receiver對象各自擁自己的發射信號和槽,例如例子中QPushButton有clicked()信號和QApplication有quit()槽。
QPushButton的信號是通過繼承而來的,它繼承自QAbstractButton類,這個類本身擁有以下信號:
分別有1個信號繼承自QWidget、QObject。主要的還是上面4個信號。
看看就好~嘿嘿,自己也可以嘗試。
QApplication的有以下槽:
在例子中,使用了一個quit(),這個槽是QApplication繼承自QCoreApplication類得到的。
在QCoreApplication中,定義了quit()這個槽。
例子中,clicked()信號表明當用戶單擊了按鈕button時會發射的信號,然後執行app對象中的槽quit(),從而退出這個程式。
就暫時到這裡吧,到這裡,也算是初步瞭解了什麼是信號和槽。這個是Qt編程的基礎。
另外,Qt幫助文檔也是一個不錯的東西。
如果是使用Qt Creator,想要知道某一個Qt類的詳細信息的話,單擊一下類名,按F1就可以轉到幫助文檔了。
在我看來,信號和槽進位比較好理解,簡單地想成是一個發送方和接收方就行了,當點擊按鈕時,發送方發送一個clicked()的消息給接收方,接收方接收消息之後開始做自己的動作。
當然了,畢竟只是自己的總結筆記,有些地方是自己理解來寫的,如果理解是錯誤的請見諒~