一般來說,我們發出訊號使用emit這個關鍵字來操作,但是會發現,emit並不算乙個呼叫,所以它沒有返回值。那麼如果我們發出這個訊號想獲取乙個返回值怎麼辦呢?
兩個辦法:1.通過出參形式返回,引用或者指標的方式帶回;比如emit sig(int& i)或者emit sig(void* pointer),但是這個方法有乙個弊端,稍後介紹第二種方式會提醒。
2.通過qt自帶的invoke機制呼叫:參考文件對qmetaobject::invokemethod的說明:invokes the member (a signal or a slot name) on the object obj.也就是說**是可以**訊號或者槽的。一般來說,我們使用invokemethod是在子執行緒需要排程ui操作的時候(已經有很多文章詳細說明了使用方式,不再贅述),因為ui操作只能在主線程中使用(否則會出現未定義錯誤),通過這種**方式,讓要操作的事件回到主線程時間片的時候再來執行。大部分情況下,我們把ui操作封裝在乙個槽裡,用**方式來排程。同樣訊號也可以用這種方式,但是有幾點需要注意的是,1.呼叫**的連線方式:如果訊號和連線槽在乙個執行緒內,那麼必須用qt::directconnection或者qt::autoconnection,這樣的話,保證訊號**後,執行緒會等待訊號連線槽執行完畢,才可能取到我們需要的返回值;如果使用了qt::queuedconnection,那麼訊號只是負責把事件交給事件佇列,然後馬上做出返回,這樣,是否有返回值就無法確定了(這也就是第乙個方法的弊端,因為訊號發射是根據訊號和槽各自的執行緒情況來選擇的連線方式).如果訊號和槽在兩個執行緒中,那麼首先肯定不能使用qt::directconnection,除非你很清楚連線槽的動作是否保證了執行緒安全。但根據第一條的說明,也不能使用qt::queuedconnection。不過還好qt提供了乙個額外的連線方式就是qt::blockingqueuedconnection,這個連線方式會阻塞住發射訊號的執行緒一直等到佇列連線槽返回後,才會恢復阻塞,這樣就可以保證我們能拿到真正的返回值。(但是使用這種方式需要你清楚的知道,發射執行緒是否允許阻塞和連線槽是否對這個阻塞執行緒有什麼特別的操作,一般來說,如果這個執行緒並不是由你自己控制的話,不要隨便嘗試去阻塞別人的執行緒,因為你並不清楚別人執行緒的執行邏輯)
呼叫方式大致**如下bool breturn; qmetaobject::invokemethod(&object, "sig", qt::directconnection/*qt::queuedconnection*/, q_return_arg(bool, breturn), q_arg(int, i));
C lambda查詢帶返回值
具體如下 var lists new list foreach var item in lists.where x x.length 2 如果願意,完全可以使用action進行輸入上述的item,而不是在foreach中加一層判斷。問題簡單描述就是 簡單來說就是直接在where中輸出長度大於2的字元...
帶返回值的介面寫法
假定介面需要返回乙個指標,且可能涉及某些條件判斷,不一定能獲取到有效指標,大部分人寫法如下 根據條件判斷是否返回有效值 pointer getptr void 之後為了 嚴謹,會有以下操作 pointer pptr getptr if pptr nullptr 很多地方呼叫getptr介面的話,到處...
Java 帶引數帶返回值方法的使用
如果方法既包含引數,又帶有返回值,我們稱為帶引數帶返回值的方法。例如 下面的 定義了乙個show 方法,帶有乙個引數 name 方法執行後返回乙個 string 型別的結果 public string show string name return 歡迎您,name 呼叫帶參帶返回值的方法 hell...