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

2021-05-21 21:16:50 字數 1977 閱讀 3330

訊號槽機制是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 函式呼叫...