槽就是乙個可以被呼叫處理特定訊號的函式
乙個小的qt類如下:
class foo : public qobjectpublic slots:
void setvalue( int );
signals:
void valuechanged( int );
private:
int val;
};
qt中的元物件系統是用來處理物件間通訊的訊號/槽機制、執行時的型別資訊和動態屬性系統。雖然你使用qobject作為乙個基類而不使用q_object巨集和元物件**是可以的,但是如果q_object巨集沒有被使用,它基於下列三類:
qobject
類; 類宣告中的私有段中的q_object巨集;
元物件編譯器(moc)
。 moc
讀取c++原始檔。如果它發現其中包含乙個或多個類的宣告中含有q_object巨集,它就會給含有q_object巨集的類生成
另乙個含有元物件**的c++原始檔。這個生成的原始檔可以被類的原始檔包含(#include)到或者和這個類的實現一起編譯和連線。
除了提供物件間通訊的訊號和槽
機制之外(介紹這個系統的主要原因),qobject中的元物件**實現其它特徵:
那麼這裡的訊號和槽以及其它特徵描述都不會被提供。根據元物件系統的觀點,
乙個沒有元**的qobject的子類和它含有元物件**的最近的祖先相同。
舉例來說就是,classname()將不會返回你的類的實際名稱,返回的是它的這個祖先的名稱。
強烈建議qobject
的所有子類使用q_object巨集,而不管它們是否實際使用了訊號、槽和屬性。
下面是把兩個物件連線在一起的一種方法:
foo a, b;呼叫a.setvalue(79)會使a發射乙個valuechanged() 訊號,b將會在它的setvalue()槽中接收這個訊號,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();
也就是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...