在QT的訊號和槽中使用自定義型別

2021-07-05 17:25:37 字數 796 閱讀 2887

qt的訊號和槽機制由於實現的年代比較久遠,所以採用的是**預編譯而不是更時髦的模板技術來實現。但實際使用起來還是挺方便的。也能夠很好地用於跨執行緒的通訊場景,比如後台執行緒取到資料後通知ui執行緒顯示。

最近遇到乙個有趣的問題:我們在乙個訊號中用了自定義型別,之前使用完全沒有問題。後來我們改到非ui執行緒中發射訊號,結果槽函式就呼叫不到了。

通過檢視執行時日誌,發現qt在connect訊號的時候有警告:qobject::connect: cannot queue arguments of type 'foo' 

(make sure 'foo' is registered using qregistermetatype().) 。 通過檢視,原來qt如果要在訊號中使用自定義型別,需要首先呼叫qregistermetatype函式,語句類似 

qregistermetatype("foo");

其實不止是自定義型別,包括qlist這種qt的容器類也是一樣的。估計qt只是給少數幾個類如qstring註冊了。還有少數原生型別,比如發現__int64也是需要註冊的,qregistermetatype

<__int64

>(

"__int64

");。

另外有個建議:就是使用訊號和槽的時候,盡量使用qt而不是標準庫的容器類,比如qstring、qlist等等。這主要是出於效能上的考慮。qt的容器包括qstring都使用了implicitly 

shared技術,所以拷貝建構函式執行速度是很快的。很適用於訊號槽這種封包機制。因為封包本質上就是把函式的位址和函式的所有入參都儲存起來,所以免不了呼叫函式入參的拷貝建構函式。

在QT的訊號和槽中使用自定義型別

qt的訊號和槽機制由於實現的年代比較久遠,所以採用的是 預編譯而不是更時髦的模板技術來實現。但實際使用起來還是挺方便的。也能夠很好地用於跨執行緒的通訊場景,比如後台執行緒取到資料後通知ui執行緒顯示。最近遇到乙個有趣的問題 我們在乙個訊號中用了自定義型別,之前使用完全沒有問題。後來我們改到非ui執行...

自定義類使用訊號和槽

要使用訊號和槽,需要繼承qobject類.否則會提示connect函式錯誤 class myclass public qobject q object public myclass qobject parent nullptr private slot void my slot void mycla...

Qt自定義訊號槽

qt自定義訊號槽,在控制台程式中實現 qt5 如下 qt5 include news h class news public qobject void send signals void new const qstring name private qstring m name reader.h i...