Qt 之路 09 深入訊號和槽

2021-06-11 17:37:03 字數 2227 閱讀 5172

訊號槽機制是qt程式設計的基礎。通過訊號槽,能夠使qt各元件在不知道對方的情形下能夠相互通訊。這就將類之間的關係做了最大程度的解耦。槽函式和普通的c++成員函式沒有很大的區別。它們也可以使virtual的;可以被重寫;可以使public、protected或者private的;可以由其它的c++函式呼叫;引數可以是任何型別的。如果要說區別,那就是,槽函式可以和乙個訊號相連線,當這個訊號發生時,它可以被自動呼叫。

connect()語句的原型類似於:

connect(sender, signal(signal), receiver, slot(slot));

這裡,sender和receiver都是qobject型別的,singal和slot都是沒有引數名稱的函式簽名。singal()和slot()巨集用於把引數轉換成字串。

深入的說,訊號槽還有更多可能的用法,如下所示。

乙個訊號可以和多個槽相連:

connect(slider, signal(valuechanged(int)),

spinbox, slot(setvalue(int)));

connect(slider, signal(valuechanged(int)),

this, slot(updatestatusbarindicator(int)));

這是說,只要任意乙個訊號發出,這個槽就會被呼叫。

乙個訊號可以連線到另外的乙個訊號:

connect(lineedit, signal(textchanged(const qstring &)),

this, signal(updaterecord(const qstring &)));

這是說,當第乙個訊號發出時,第二個訊號被發出。除此之外,這種訊號-訊號的形式和訊號-槽的形式沒有什麼區別。

disconnect(lcd, signal(overflow()),

this, slot(handlematherror()));

這種情況並不經常出現,因為當乙個物件delete之後,qt自動取消所有連線到這個物件上面的槽。

為了正確的連線訊號槽,訊號和槽的引數個數、型別以及出現的順序都必須相同,例如:

connect(ftp, signal(rawcommandreply(int, const qstring &)),

this, slot(processreply(int, const qstring &)));

這裡有一種例外情況,如果訊號的引數多於槽的引數,那麼這個引數之後的那些引數都會被忽略掉,例如:

connect(ftp, signal(rawcommandreply(int, const qstring &)),

this, slot(checkerrorcode(int)));

這裡,const qstring &這個引數就會被槽忽略掉。

如果訊號槽的引數不相容,或者是訊號或槽有乙個不存在,或者在訊號槽的連線中出現了引數名字,在debug模式下編譯的時候,qt都會很智慧型的給出警告。

在這之前,我們僅僅在widgets中使用到了訊號槽,但是,注意到connect()函式其實是在qobject中實現的,並不侷限於gui,因此,只要我們繼承qobject類,就可以使用訊號槽機制了:

class employee : public qobject

int salary() const

public slots:

void setsalary(int newsalary);

signals:

void salarychanged(int newsalary);

private:

int mysalary;

};

在使用時,我們給出下面的**:

void employee::setsalary(int newsalary)

}

這樣,當setsalary()呼叫的時候,就會發出salarychanged()訊號。注意這裡的if判斷,這是避免遞迴的方式!還記得前面提到的迴圈連線嗎?如果沒有if,當出現了迴圈連線的時候就會產生無限遞迴。

Qt學習之路 9 深入了解訊號槽

訊號槽機制是qt程式設計的基礎。通過訊號槽,能夠使qt各元件在不知道對方的情形下能夠相互通訊。這就將類之間的關係做了最大程度的解耦。槽函式和普通的c 成員函式沒有很大的區別。它們也可以使virtual的 可以被重寫 可以使public protected或者private的 可以由其它的c 函式呼叫...

Qt學習之路 9 深入了解訊號槽

槽函式和普通的c 成員函式沒有很大的區別。它們也可以使virtual的 可以被重寫 可以使public protected或者 private的 可以由其它的c 函式呼叫 引數可以是任何型別的。如果要說區別,那就是,槽函式可以和乙個訊號相連線,當這個訊號發生時,它可以被自動呼叫。connect 語句...

Qt學習之路隨記 訊號槽

qt 5.9.2 版本,qobject connect 常用的形式為 connect sender,signal,receiver,slot connect 一般會使用前面四個引數,第乙個是發出訊號的物件,第二個是傳送物件發出的訊號,第三個是接收訊號的物件,第四個是接收物件在接收到訊號之後所需要呼叫...