lesson2-訊號與槽機制_PHP教程

來源:互聯網
上載者:User

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)、嵌套的類不能位於訊號和槽地區,也不能有訊號和槽






















http://www.bkjia.com/PHPjc/1068093.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/1068093.htmlTechArticlelesson2-訊號與槽機制 一、訊號與槽的理解 1、什麼是訊號和槽? 在許多GUI工具中,每一個視窗組件都有一個回呼函數用於響應他們能夠觸發...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.