核心: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...