Qt 槽函式中獲取發出訊號的物件

2021-07-25 23:44:17 字數 2116 閱讀 2896



核心:qobject::sender()

對於訊號與槽的連線

connect( obj1 , signal(sigfun()) , obj2 , slot(slotfun()) )

或者connect( obj1 , &object1::sigfun , obj2 , &object2::slotfun )

可以通過訊號與槽函式的引數來傳遞資料

但是存在一些情況,我們希望能在slotfun()裡去獲得obj1物件指標

實際上可以通過qt基類qobject::sender(),在槽函式裡獲得繫結的訊號的**物件,解決一些動態繫結訊號與槽的情況下,非常有用

例子:選單欄中的最近開啟檔案列表

最近開啟檔案位址列表

qlistfilelist;

生成對應的qaction

for(int i=0;i

我們在qaction裡動態setdata了一些資料

正常情況,只能知道觸發了選單qaction,由於是動態建立的qaction,所以沒辦法在槽函式slotfun裡確定是哪個qaction觸發了這個槽,所以也就沒辦法獲取act->data()裡的資料

那麼在槽函式裡使用qobject::sender(),我們就能獲得觸發該槽函式的訊號的物件

slotfun()

當某乙個object emit乙個signal的時候,它就是乙個sender,系統會記錄下當前是誰emit出這個signal的,

所以你在對應的slot裡就可以通過  sender()得到當前是誰invoke了你的slot,對應的是qobject->d->sender.

有可能多個object的signal會連線到同乙個signal(例如多個button可能會connect到乙個slot函式onclick()),因此這是就需要判斷到底是哪個object emit了這個signal,根據sender的不同來進行不同的處理

qobject::sender()返回傳送訊號的物件的指標,返回型別為qobject *

示例**:

qtimeedit *editor = qobject_cast(sender());  

此時可以對editor進行進一步的處理了。

你在乙個槽裡面,呼叫這個函式,返回的就是你訊號**的物件;

qpushbutton *aaaa = new qpushbutton(this);

比如 connect(aaaaa, signal(click()), this, slot(onaaaaa());

void onaaaaa()

這個ccc就是aaaa這個物件來的。

qt是通過訊號和槽的機制進行事件傳遞的,當有多個不同型別、或相同型別的物件的傳送訊號都通過乙個槽來處理的時候,需要在槽中識別出這些訊號然後做相應的處理。

例如:在乙個介面中有16個按鈕(qpushbutton)和4個(qradiobutton)這20個物件的signal(clicked(bool))都連線(connect)到同乙個按鍵的處理槽中(void get_keyvalue(bool))

那麼就需要在get_keyvalue這個槽中把這些訊號的傳送者都識別出來,然後取其相應的鍵值然後傳送,其方法是:

void fbx:

:get_keyvalue(bool)

else

if(qradiobutton *rtn = dynamic_cast

>

(sender())

)}在槽(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中的語句就不會執行了。

Qt 槽函式中獲取發出訊號的物件

核心 qobject sender 對於訊號與槽的連線 connect obj1 signal sigfun obj2 slot slotfun 或者connect obj1 object1 sigfun obj2 object2 slotfun 可以通過訊號與槽函式的引數來傳遞資料 但是存在一些情...

QT 訊號已發出,但是槽函式未執行

問題描述 我的工程使用udp進行通訊,初始程式執行正常。執行一段時間後,udp正常接收資料,並且成功將收到的資料發出訊號,但是此時不執行槽函式。並且介面出現卡死現象。猜想可能 執行緒阻塞 物件異常銷毀 總感覺沒有遇到過,後邊發覺確實想多了 後續解決 1.使用資料庫連線池的時候只是增加db,每次使用完...

QT訊號槽connect函式

使用qt開發時,通常使用connect函式只傳遞四個引數 connect sender,signal signal receiver,slot slot 所以我們有可能認為該函式就只有四個引數,但實際上是有第五個引數的,只是通常該函式已經給第五個引數賦值了而已,我們所使用的是預設值 sender和r...