QT D Bus 複雜引數傳遞

2021-07-16 18:39:46 字數 1449 閱讀 3410

網上一搜,關於d-bus和qt的資料不少,但是絕大多數都對傳遞自定義資料型別這個問題閉口不談。看來這個有必要寫個文章記錄一下。

首先要說的是,我這裡不再介紹d-bus和qdbus的基礎知識,本文直擊要點。另外本文參考了kde的一些文件。

需求:使用標準的訊號和槽,通過qdbus傳遞自定義的struct或者class資料型別。

首先,需要定義需要通過d-bus傳遞的自定義資料型別,我們這裡定義乙個message型別: 

#include

class message 

; q_declare_metatype(message)

可以看到有幾個比較特殊的地方:

首先我們過載了《和》兩個運算子,這是將自定義資料型別融合到qt的型別系統所必需的: 

qdbusargument &operator<<(qdbusargument &argument, const message& message) 

const qdbusargument &operator>>(const qdbusargument &argument, message &message) 

其次,這個自定義資料型別需要註冊到qt和d-bus的型別系統: 

void message::registermetatype() 

有了這個資料型別,就可以寫描述d-bus介面的xml檔案了:

"> 

messagesent"> 

sendmessage"> 

這裡有兩個特殊點,乙個是引數的資料型別,因為是我們自定義的,不存在於d-bus規範中,所以引數的type在這裡可以亂寫。另乙個就是,既然是自定義的,就要說明這個自定義的資料型別到底是啥(在這裡是message)。

ok,有了上面這些囉嗦的準備工作,下面呼叫qt自帶的d-bus工具,就可以自動生成相關的介面和**類了:

qdbusxml2cpp chat.xml -i message.h -a messageadaptor

qdbusxml2cpp chat.xml -i message.h -p messageinte***ce

後續就是標準的呼叫qdbus過程了,本文不再廢話,請參考其他入門資料。大體上就是這樣:

接收:

connect(&m_messageinte***ce, signal(messagesent(message)), slot(onmessagesent(message)));

傳送:

message message(…);

m_messageinte***ce.sendmessage(message);

使用qt dbus 傳遞複雜資料結構的方法

參考文章 如何用dbus glib傳遞複雜的資料結構 經過多次試驗 qdbusxml2cpp 對諸如 qlist,qstringlist 等高階資料結構支援並不好,無奈之舉,只有用 字元資料這個容器來處理,在qt中對應qbytearray xml檔案中這樣寫後,qdbusxml2cpp 自動用qby...

python 引數傳遞 Python 引數傳遞

python中的變數 乙個變數是區域性還是全域性,在編譯函式的時候就已經決定,因此讀變數值的時候也不會逐層向外查詢。變數是全域性還是局域,根據如下3條 1.如果函式內部有global語句,那麼它宣告的變數是全域性的。2.如果函式內部有對變數的賦值語句,那麼它是局域的。3.除此之外都是全域性的。注意1...

python 引數傳遞 python引數傳遞

python中函式引數的傳遞是通過 賦值 來傳遞的。但這條規則只回答了函式引數傳遞的 戰略問題 並沒有回答 戰術問題 也就說沒有回答怎麼賦值的問題。函式引數的使用可以分為兩個方面,一是函式引數如何定義,二是函式在呼叫時的引數如何解析的。而後者又是由前者決定的。函式引數的定義有四種形式 1.f arg...