QT 的信號(hào)與槽機(jī)制(1)
QT 的信號(hào)與槽機(jī)制(1)
信號(hào)
當(dāng)某個(gè)信號(hào)對(duì)其客戶(hù)或所有者發(fā)生的內(nèi)部狀態(tài)發(fā)生改變,信號(hào)被一個(gè)對(duì)象發(fā)射。只有 定義過(guò)這個(gè)信號(hào)的類(lèi)及其派生類(lèi)能夠發(fā)射這個(gè)信號(hào)。當(dāng)一個(gè)信號(hào)被發(fā)射時(shí),與其相關(guān)聯(lián)的槽將被立刻執(zhí)行,就象一個(gè)正常的函數(shù)調(diào)用一樣。信號(hào) - 槽機(jī)制完全獨(dú)立于任何 GUI 事件循環(huán)。只有當(dāng)所有的槽返回以后發(fā)射函數(shù)(emit)才返回。 如果存在多個(gè)槽與某個(gè)信號(hào)相關(guān)聯(lián),那么,當(dāng)這個(gè)信號(hào)被發(fā)射時(shí),這些槽將會(huì)一個(gè)接一個(gè)地 執(zhí)行,但是它們執(zhí)行的順序?qū)?huì)是隨機(jī)的、不確定的,我們不能人為地指定哪個(gè)先執(zhí)行、哪 個(gè)后執(zhí)行。
信號(hào)的聲明是在頭文件中進(jìn)行的,QT 的 signals 關(guān)鍵字指出進(jìn)入了信號(hào)聲明區(qū),隨后即可 聲明自己的信號(hào)。例如,下面定義了三個(gè)信號(hào):
signals:
void mySignal();
void mySignal(int x);
void mySignalParam(int x,int y);
既然槽是普通的成員函數(shù),因此與其它的函數(shù)一樣,它們也有存取權(quán)限。槽的存取權(quán)限決定了誰(shuí)能夠與其相關(guān)聯(lián)。同普通的 C++ 成員函數(shù)一樣,槽函數(shù)也分為三種類(lèi)型,即 public slots、private slots 和 protected slots。
public slots:在這個(gè)區(qū)內(nèi)聲明的槽意味著任何對(duì)象都可將信號(hào)與之相連接。這對(duì)于組件編程非常有用,你可以創(chuàng)建彼此互不了解的對(duì)象,將它們的信號(hào)與槽進(jìn)行連接以便信息能夠正確的傳遞。
protected slots:在這個(gè)區(qū)內(nèi)聲明的槽意味著當(dāng)前類(lèi)及其子類(lèi)可以將信號(hào)與之相連接。這適用于那些槽,它們是類(lèi)實(shí)現(xiàn)的一部分,但是其界面接口卻面向外部。
private slots:在這個(gè)區(qū)內(nèi)聲明的槽意味著只有類(lèi)自己可以將信號(hào)與之相連接。這適用于聯(lián)系非常緊密的類(lèi)。
槽也能夠聲明為虛函數(shù),這也是非常有用的。
槽的聲明也是在頭文件中進(jìn)行的。例如,下面聲明了三個(gè)槽:
public slots:
void mySlot();
void mySlot(int x);
void mySignalParam(int x,int y);
信號(hào)與槽的關(guān)聯(lián)
通過(guò)調(diào)用 QObject 對(duì)象的 connect 函數(shù)來(lái)將某個(gè)對(duì)象的信號(hào)與另外一個(gè)對(duì)象的槽函數(shù)相關(guān)聯(lián),這樣當(dāng)發(fā)射者發(fā)射信號(hào)時(shí),接收者的槽函數(shù)將被調(diào)用。該函數(shù)的定義如下:
static bool QObject::connect(const QObject *sender, const char *signal,const QObject *receiver, const char *method,Qt::ConnectionType type)
用信號(hào)signals和槽slots需注意的基本問(wèn)題是:
在所有包含signal與slot的類(lèi)的聲明中:
1)在類(lèi)class聲明中必須加入Q_OBJECT
2)類(lèi)的聲明文件必須成單獨(dú)保存一個(gè)到.h文件
信號(hào)
當(dāng)某個(gè)信號(hào)對(duì)其客戶(hù)或所有者發(fā)生的內(nèi)部狀態(tài)發(fā)生改變,信號(hào)被一個(gè)對(duì)象發(fā)射。只有 定義過(guò)這個(gè)信號(hào)的類(lèi)及其派生類(lèi)能夠發(fā)射這個(gè)信號(hào)。當(dāng)一個(gè)信號(hào)被發(fā)射時(shí),與其相關(guān)聯(lián)的槽將被立刻執(zhí)行,就象一個(gè)正常的函數(shù)調(diào)用一樣。信號(hào) - 槽機(jī)制完全獨(dú)立于任何 GUI 事件循環(huán)。只有當(dāng)所有的槽返回以后發(fā)射函數(shù)(emit)才返回。 如果存在多個(gè)槽與某個(gè)信號(hào)相關(guān)聯(lián),那么,當(dāng)這個(gè)信號(hào)被發(fā)射時(shí),這些槽將會(huì)一個(gè)接一個(gè)地 執(zhí)行,但是它們執(zhí)行的順序?qū)?huì)是隨機(jī)的、不確定的,我們不能人為地指定哪個(gè)先執(zhí)行、哪 個(gè)后執(zhí)行。
信號(hào)的聲明是在頭文件中進(jìn)行的,QT 的 signals 關(guān)鍵字指出進(jìn)入了信號(hào)聲明區(qū),隨后即可 聲明自己的信號(hào)。例如,下面定義了三個(gè)信號(hào):
signals:
void mySignal();
void mySignal(int x);
void mySignalParam(int x,int y);
在上面的定義中,signals 是 QT 的關(guān)鍵字,而非 C/C++ 的。
接下來(lái)的一行 void mySignal() 定義了信號(hào) mySignal,這個(gè)信號(hào)沒(méi)有攜帶參數(shù);
接下來(lái)的一行 void mySignal(int x) 定義 了重名信號(hào) mySignal,但是它攜帶一個(gè)整形參數(shù),這有點(diǎn)類(lèi)似于 C++ 中的虛函數(shù)。
從形式上 講信號(hào)的聲明與普通的 C++ 函數(shù)是一樣的,但是信號(hào)卻沒(méi)有函數(shù)體定義,另外,信號(hào)的返回 類(lèi)型都是 void,不要指望能從信號(hào)返回什么有用信息。
信號(hào)由 moc 自動(dòng)產(chǎn)生,它們不應(yīng)該在 .cpp 文件中實(shí)現(xiàn)。
槽
槽是普通的 C
既然槽是普通的成員函數(shù),因此與其它的函數(shù)一樣,它們也有存取權(quán)限。槽的存取權(quán)限決定了誰(shuí)能夠與其相關(guān)聯(lián)。同普通的 C++ 成員函數(shù)一樣,槽函數(shù)也分為三種類(lèi)型,即 public slots、private slots 和 protected slots。
public slots:在這個(gè)區(qū)內(nèi)聲明的槽意味著任何對(duì)象都可將信號(hào)與之相連接。這對(duì)于組件編程非常有用,你可以創(chuàng)建彼此互不了解的對(duì)象,將它們的信號(hào)與槽進(jìn)行連接以便信息能夠正確的傳遞。
protected slots:在這個(gè)區(qū)內(nèi)聲明的槽意味著當(dāng)前類(lèi)及其子類(lèi)可以將信號(hào)與之相連接。這適用于那些槽,它們是類(lèi)實(shí)現(xiàn)的一部分,但是其界面接口卻面向外部。
private slots:在這個(gè)區(qū)內(nèi)聲明的槽意味著只有類(lèi)自己可以將信號(hào)與之相連接。這適用于聯(lián)系非常緊密的類(lèi)。
槽也能夠聲明為虛函數(shù),這也是非常有用的。
槽的聲明也是在頭文件中進(jìn)行的。例如,下面聲明了三個(gè)槽:
public slots:
void mySlot();
void mySlot(int x);
void mySignalParam(int x,int y);
信號(hào)與槽的關(guān)聯(lián)
通過(guò)調(diào)用 QObject 對(duì)象的 connect 函數(shù)來(lái)將某個(gè)對(duì)象的信號(hào)與另外一個(gè)對(duì)象的槽函數(shù)相關(guān)聯(lián),這樣當(dāng)發(fā)射者發(fā)射信號(hào)時(shí),接收者的槽函數(shù)將被調(diào)用。該函數(shù)的定義如下:
static bool QObject::connect(const QObject *sender, const char *signal,const QObject *receiver, const char *method,Qt::ConnectionType type)
用信號(hào)signals和槽slots需注意的基本問(wèn)題是:
在所有包含signal與slot的類(lèi)的聲明中:
1)在類(lèi)class聲明中必須加入Q_OBJECT
2)類(lèi)的聲明文件必須成單獨(dú)保存一個(gè)到.h文件
posted on 2012-08-24 15:41 天下 閱讀(429) 評(píng)論(0) 編輯 收藏 引用 所屬分類(lèi): QT