在qt使用自定義的資料結構時會遇到如下問題:
qobject:
:connect: cannot queue arguments of type 'textandnumber'
(make sure 'textandnumber' is registed using qregistermetatype()
.)
因為從signal到slot的過程中會需要對資料進行construct、destruct、copy,qt需要知道對應的型別,所以對自定義的資料型別需要進行註冊,再使用:
新增標頭檔案
#include
新增宣告
q_declare_metatype(textandnumber);
註冊(根據需要選取使用的方式)
qregistermetatype
("teststruct");
qregistermetatype
("teststruct&");
qregistermetatype:shared_ptr>
("std::shared_ptr"
);
使用
connect
(this,
signal
(playsignal
(std:
:shared_ptr))
, this,
slot
(playslot
(std:
:shared_ptr))
, qt:
:directconnection)
;
qt訊號槽支援6種連線方式,其中3中最主要:
qt::directconnection
當訊號發出後,相應的槽函式將立即被呼叫。emit語句後的**將在所有槽函式執行完畢後被執行。(訊號與槽函式關係類似於函式呼叫,同步執行)
qt::queuedconnection
當訊號發出後,排隊到訊號佇列中,需等到接收物件所屬執行緒的事件迴圈取得控制權時才取得該訊號,呼叫相應的槽函式。emit語句後的**將在發出訊號後立即被執行,無需等待槽函式執行完畢。(此時訊號被塞到訊號佇列裡了,訊號與槽函式關係類似於訊息通訊,非同步執行)
qt::autoconnection
qt的預設連線方式,如果訊號的發出和接收這個訊號的物件同屬乙個執行緒,那個工作方式與直連方式相同;否則工作方式與排隊方式相同。
C 資訊槽 訊號槽
訊號槽作用 1 可以將事件源和訂閱處理者分開 2 降低耦合性,事件源只需要向外界暴露最少的資訊,內部改變不影響外部行為 3.降低 複雜性,將事件不同的處理 分散到各個訂閱者內部。使用資訊槽 1 包含標頭檔案,include sigslot.h using namespace sigslot 2 在事...
QT 訊號和槽連線問題
1 networ 程連線設定介面 不要用訊號和槽 connect network getinstance this,x netwok網路連線後傳送訊號emit 但是這樣會導致 network已經連線成功,且emit了訊號,但是connect連線還沒成功,所以介面上的槽函式不會響應 解決方案 在net...
Qt訊號槽中引數的元物件註冊
最近專案中遇到乙個問題 執行緒中的槽函式總是無法響應。原因 費了九牛二虎之力終於找到問題之所在,原來是所用的訊號槽中的引數型別不是qt的自帶的基礎型別,而是自定義型別,qt的訊號槽在主線程和子執行緒中只能傳遞qt的基礎資料型別,比如qstring int等 不是執行緒與執行緒間傳遞不存在這個問題 所...