訊號槽機制是 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(lcd, signal(overflow()),this, slot(handlematherror()));
connect(calculator, signal(divisionbyzero()),this, slot(handlematherror()));
這是說,只要任意乙個訊號發出,這個槽就會被呼叫。
乙個訊號可以連線到另外的乙個訊號:
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 語句...
深入了解A
一 前言 在這裡我將對a 演算法的實際應用進行一定的 並且舉乙個有關a 演算法在最短路徑搜尋的例子。值得注意的是這裡並不對a 的基本的概念作介紹,如果你還對a 演算法不清楚的話,請看姊妹篇 初識a 演算法 這裡所舉的例子是參考amit主頁中的乙個源程式,使用這個源程式時,應該遵守一定的公約。二 a ...