訊號槽機制是qt程式設計的基礎。通過訊號槽,能夠使qt各元件在不知道對方的情形下能夠相互通訊。這就將類之間的關係做了最大程度的解耦。
槽函式和普通的c++成員函式沒有很大的區別。它們也可以使virtual的;可以被重寫;可以使public、protected或者private的;可以由其它的c++函式呼叫;引數可以是任何型別的。如果要說區別,那就是,槽函式可以和乙個訊號相連線,當這個訊號發生時,它可以被自動呼叫。
connect()語句的原型類似於:
這裡,sender和receiver都是qobject型別的,singal和slot都是沒有引數名稱的函式簽名。singal()和slot()巨集用於把引數轉換成字串。
深入的說,訊號槽還有更多可能的用法,如下所示。
乙個訊號可以和多個槽相連:
int)),
spinbox, slot(setvalue(
int)));
int)),
this, slot(updatestatusbarindicator(
int)));
注意,如果是這種情況,這些槽會乙個接乙個的被呼叫,但是它們的呼叫順序是不確定的。
多個訊號可以連線到乙個槽:
this, slot(handlematherror()));
this, slot(handlematherror()));
這是說,只要任意乙個訊號發出,這個槽就會被呼叫。
乙個訊號可以連線到另外的乙個訊號:
const qstring &)),
this, signal(updaterecord(
const qstring &)));
這是說,當第乙個訊號發出時,第二個訊號被發出。除此之外,這種訊號-訊號的形式和訊號-槽的形式沒有什麼區別。
this, slot(handlematherror()));
這種情況並不經常出現,因為當乙個物件delete之後,qt自動取消所有連線到這個物件上面的槽。
為了正確的連線訊號槽,訊號和槽的引數個數、型別以及出現的順序都必須相同,例如:
int,
const qstring &)),
this, slot(processreply(
int,
const qstring &)));
這裡有一種例外情況,如果訊號的引數多於槽的引數,那麼這個引數之後的那些引數都會被忽略掉,例如:
int,
const qstring &)),
int)));
這裡,const qstring &這個引數就會被槽忽略掉。
如果訊號槽的引數不相容,或者是訊號或槽有乙個不存在,或者在訊號槽的連線中出現了引數名字,在debug模式下編譯的時候,qt都會很智慧型的給出警告。
在這之前,我們僅僅在widgets中使用到了訊號槽,但是,注意到connect()函式其實是在qobject中實現的,並不侷限於gui,因此,只要我們繼承qobject類,就可以使用訊號槽機制了:
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 深入了解訊號槽
槽函式和普通的c 成員函式沒有很大的區別。它們也可以使virtual的 可以被重寫 可以使public protected或者 private的 可以由其它的c 函式呼叫 引數可以是任何型別的。如果要說區別,那就是,槽函式可以和乙個訊號相連線,當這個訊號發生時,它可以被自動呼叫。connect 語句...
lineedit訊號 Qt 深入了解訊號槽
訊號槽機制是 qt 程式設計的基礎。通過訊號槽,能夠使 qt 各元件在不知道對方的情形下能夠相互通訊。這就將類之間的關係做了最大程度的解耦。槽函式和普通的 c 成員函式沒有很大的區別。它們也可以使 virtual 的 可以被重寫 可以使public protected 或者 private 的 可以...
Qt 之路 09 深入訊號和槽
訊號槽機制是qt程式設計的基礎。通過訊號槽,能夠使qt各元件在不知道對方的情形下能夠相互通訊。這就將類之間的關係做了最大程度的解耦。槽函式和普通的c 成員函式沒有很大的區別。它們也可以使virtual的 可以被重寫 可以使public protected或者private的 可以由其它的c 函式呼叫...