訊號槽註冊問題

2021-10-10 09:20:06 字數 1280 閱讀 6088

在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等 不是執行緒與執行緒間傳遞不存在這個問題 所...