Qt是通過信號和槽的機制進行事件傳遞的,當有多個不同類型、或相同類型的物件的發送信號都通過一個槽來處理的時候,需要在槽中識別出這些信號然后做相應的處理。
例如:
在一個界面中有16個按鈕(QPushButton)和4個(QRadioButton)這20個物件的SIGNAL(clicked(bool))都連接(connect)到同一個按鍵的處理槽中(void get_keyvalue(bool))
那么就需要在get_keyvalue這個槽中把這些信號的發送者都識別出來,然后取其相應的鍵值然后發送,其方法是:
- void FBx::get_keyvalue(bool)
- {
- if (QPushButton* btn = dynamic_cast<QPushButton*>(sender())){
- send_key(btn->whatsThis());
- }
- else if (QRadioButton *rtn = dynamic_cast<QRadioButton*>(sender())){
- send_key(rtn->whatsThis());
- }
- }
在槽(SLOT)中sender()函數會返回一個指向QObject 的指針來指向信號的發送者(Returns a pointer to the object that sent the signal, if called in a slot activated by a signal;)。然后通過C++ RTTI(Run-Time Type Identification)機制提供的dynamic_cast運算符,在執行的時候檢查sender()返回的對象是否是QPushButton類,如果是則將sender()返回的QObject指針轉換為QPushButton指針,然后if中的語句就會執行。如果sender()返回的對象不是QPushButton類型的指針,則dynamic_cast就會返回0,if中的語句就不會執行了。