你可以為一個槽串連多個訊號, 同樣一個訊號也可以被串連到多個槽.甚至於你可以把一個
訊號直接連接到其他訊號. (在第一個訊號發送後將馬上發送第二個訊號.)
總之, 訊號和槽形成了一個強大的組件編程機制.
一個很小的基於對象聲明如下:
#include <QObject>
class Counter : public QObject
{
Q_OBJECT
public:
Counter() { m_value = 0; }
int value() const { return m_value; }
public slots:
void setValue(int value);
signals:
void valueChanged(int newValue);
private:
int m_value;
};
這個類可以通過發送訊號 valueChanged(), 來告訴外
部世界它的狀態改變,並且它有一個可以接受其他對象發送訊號的槽.
所有包含訊號或者槽的類都應該在聲明的頂部使用 Q_OBJECT.它們都是從QObject派生而來.
槽由應用開發程式員來實現. 下面是一個對槽 Counter::setValue() 的實現:
void Counter::setValue(int value)
{
if (value != m_value) {
m_value = value;
emit valueChanged(value);
}
}
其中含有 emit 的行從該對象內部使用 value 作為參數發送 valueChanged() 訊號.
在以下代碼片斷中, 我們建立兩個 Counter 對象並使用 QObject::connect() 串連第一個
對象的 valueChanged() 訊號到第二個對象的 setValue() 槽:
Counter a, b;
QObject::connect(&a, SIGNAL(valueChanged(int)),
&b, SLOT(setValue(int)));
a.setValue(12); // a.value() == 12, b.value() == 12
b.setValue(48); // a.value() == 12, b.value() == 48
調用 a.setValue(12) 將發送一個 valueChanged(12) 訊號, 將由槽 setValue() 接收,
也就是將調用 b.setValue(12). 然後 b 同樣發動一個 valueChanged(),但是由於沒有槽
串連到 b 的 valueChanged() 訊號, 因此該訊號將被忽略.
注意函數 setValue() 只有在 value != m_value 時設定相應的值並且發送訊號.這是為了
阻止防止迴圈串連時導致無限迴圈(例如,當b.valueChanged() 被串連到a.setValue()時).
一個訊號將被發送到每一個該訊號的串連; 如果你重複串連一次,則將會發送兩個訊號.
不論何時,你都可以使用 QObject::disconnect() 來中斷連線.
訊號應該由 moc自動產生並且不應該在 .cpp 源檔案中實現它.它們永遠沒有傳回值(因此
使用 void 作為傳回值).
slot函數的傳回值是沒有意義的,signal函數是由moc編譯器實現的,從具體實現來看,不關心slot函數的傳回值。