Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> lesson2-信號與槽機制

lesson2-信號與槽機制

編輯:關於android開發

lesson2-信號與槽機制


一、信號與槽的理解
1、什麼是信號和槽?
在許多GUI工具中,每一個窗口部件都有一個回調函數用於響應他們能夠觸發的動作,這些回調函數通常是一個指向某個函數的指針。指針是一個相對麻煩的概念,在Qt中信號與槽取代了這些凌亂的函數指針,使得程序的編寫更為簡單。

當一個對象發生改變的時候,信號就由這個對象發射出去,這就是這個對象要做的全部事情,它並不知道另一端是誰在接收信號,這個過程就是真正的信息封裝,實現了絕對的安全。

槽用於接收信號,它們是普通的c++成員函數,它們並不知道是否有信號與自己關聯,而且對象並不了解通信機制

在Qt中,當點擊一個按鈕的時候,這個按鈕會發出一個信號,而這個信號會傳遞給另外一個對象,接收到信號的對象會產生相應的動作,這就是信號與槽的機制

2、信號與槽的關聯
1)、信號與槽通過
QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::Connection type=Qt::AutoCompatConnection)產生關聯
sender,信號的發送者
signal,待發送的信號
receiver,信號的接收者
method,槽函數
type,信號與槽的關聯方式

2)、type有3種類型
Qt::DirectConnection,信號發送後立即傳遞給槽,只有槽函數執行完畢返回之後,發送信號"emit<信號>"之後的代碼才能被執行
Qt::QueueConnection,信號發送後排隊,直到事件循環有能力將它傳遞給槽,而不管槽函數有沒有執行,發送信號"emit<信號>"之後的代碼
立即被執行
Qt::AutoCompatConnection,如果信號和槽在同一個線程,等同於Qt::DirectConnection;如果信號和槽不在同一個線程,那麼等同於
Qt::QueueConnection。




二、信號與槽的實例
1、信號
當對象的內部狀態發生改變,信號就被發射,只有定義了一個信號的類和它的子類才能發射這個信號。例如QPushButton類中就預定義了clicked信號,當按鈕被點擊時,就會發射clicked信號。

在Qt中除了系統預定義的信號外,也可以自定義信號

信號的聲明在頭文件中,以關鍵字signals開頭
signals:
void signals();
void signals(int x);
這裡面有兩個信號,最然名字一樣,但是攜帶的參數不一樣,有點類似於函數的重載。
信號類似一個普通的C++函數,但是它沒有實體,只有一個空殼,而且它的返回值永遠是void,不要期待從信號中返回有用的信息。信號聲明好以後,有moc工具自動產生,因此不應該放在.cpp文件中。
系統預定義信號一般會自動發射,不需要我們關心,如果需要手動發射信號,可以這樣寫emit signals();

2、槽
槽是普通的C++成員函數,可以被正常的調用,很多信號可以與槽進行關聯。既然槽是一個普通的成員函數,那麼它也有權限。因此有3種類型的槽函數,public slots,private slots, protect slots

槽函數的申明也是在頭文件中
private slots:
void mySlot1();
void mySlot1(int x);

在信號和槽函數的聲明之前,必須加一個宏Q_OBJECT,只有這樣Qt才會認識它們

3、元對象工具
moc工具會對c++文件中的類的聲明進行初始化,自動產生用於初始化元對象的c++代碼,元對象包含全部的信號和槽,以及指向這些名字的指
針。
moc讀取c++源文件,如果發現有Q_OBJECT宏聲明的類,它就會生成另外的c++源文件。moc工具不擴展#define,因此信號和槽函數中不能有宏定義

4、關聯
信號與槽的關聯通過函數connect
btn = new QPushButton();
lab = new QLabel();
connect(btn, SIGNAL(clicked()), lab, SLOT(clear()))
信號需要使用宏SIGNAL(),槽函數需要使用宏SLOT();
信號和槽的參數一定要一致;
當信號和槽屬於同一對象時,信號的接收者可以省略
connect(btn, SIGNAL(clicked()), SLOT(showMenu()))

信號和槽應該注意的問題
1)、構造函數不能在信號和槽的區域內
2)、函數指針不能做為信號和槽的參數
3)、信號和槽不能有缺省的參數
4)、信號和槽不能帶有模板類參數
5)、嵌套的類不能位於信號和槽區域,也不能有信號和槽






















  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved