qt 槽與訊號

2021-05-22 17:48:58 字數 1421 閱讀 4945

槽就是乙個可以被呼叫處理特定訊號的函式

乙個小的qt類如下:

class foo : public qobject

public slots:

void setvalue( int );

signals:

void valuechanged( int );

private:

int val;

};

qt中的元物件系統是用來處理物件間通訊的訊號/槽機制、執行時的型別資訊和動態屬性系統。 

它基於下列三類:

qobject

類; 類宣告中的私有段中的q_object巨集;

元物件編譯器(moc)

。 moc

讀取c++原始檔。如果它發現其中包含乙個或多個類的宣告中含有q_object巨集,它就會給含有q_object巨集的類生成

另乙個含有元物件**的c++原始檔。這個生成的原始檔可以被類的原始檔包含(#include)到或者和這個類的實現一起編譯和連線。

除了提供物件間通訊的訊號和槽

機制之外(介紹這個系統的主要原因),qobject中的元物件**實現其它特徵:

雖然你使用qobject作為乙個基類而不使用q_object巨集和元物件**是可以的,但是如果q_object巨集沒有被使用,

那麼這裡的訊號和槽以及其它特徵描述都不會被提供。根據元物件系統的觀點,

乙個沒有元**的qobject的子類和它含有元物件**的最近的祖先相同。

舉例來說就是,classname()將不會返回你的類的實際名稱,返回的是它的這個祖先的名稱。

強烈建議qobject

的所有子類使用q_object巨集,而不管它們是否實際使用了訊號、槽和屬性。

下面是把兩個物件連線在一起的一種方法:

foo a, b;

connect(&a, signal(valuechanged(int)), &b, slot(setvalue(int)));

b.setvalue( 11 ); // a == undefined b == 11

a.setvalue( 79 ); // a == 79 b == 79

b.value();

呼叫a.setvalue(79)會使a發射乙個valuechanged() 訊號,b將會在它的setvalue()槽中接收這個訊號,

也就是b.setvalue(79) 被呼叫。接下來b會發射同樣的valuechanged()訊號,但是因為沒有槽被連線到b的valuechanged()訊號,

所以沒有發生任何事(訊號消失了)。

注意只有當v != val的時候setvalue()函式才會設定這個值並且發射訊號。

這樣就避免了在迴圈連線的情況下(比如b.valuechanged() 和a.setvalue()連線在一起)出現無休止的迴圈的情況。

QT訊號與槽

初學qt,覺得理解qt訊號與槽比較重要,qt很多時候都需要用到訊號和槽。發射訊號會觸發相對應的槽函式的執行。乙個訊號可以對應多個槽,多個訊號可以對應乙個槽。訊號和槽是通過connect這個方法進行建立聯絡的。qt中有些類會自帶有一些訊號和槽函式,當然訊號和槽函式也可以自己定義。下面來看下很簡單的 會...

Qt訊號與槽

訊號的定義必須在signals 保留字下,並且不需要實現 槽的定義必須在slots 保留字下,需要實現 訊號和槽通過qobject connect函式連線 當訊號被觸發時,槽函式被呼叫 需要注意的是 訊號和槽是qt的拓展,所以實現訊號和槽的類,必須是qobject的子類 實現訊號和槽的類,必須以巨集...

Qt 訊號與槽

ifndef qt no signals slots keywords define slots q slots define signals q signals endif class q widgets export qabstractbutton public qwidget emit sig...