使用QtDBus作為Qt的程序通訊

2021-05-22 02:09:38 字數 1386 閱讀 3230

自從qt-4.2版本引入d-bus作為程序通訊的乙個方法之後,它就越來越有取代qcop的趨勢。它不僅在應用層之間可以互相通訊,還可以和核心做通訊。比如某些硬體事件的發生,就可以通過d-bus來互動。linux系統中的藍芽bluez正是使用了這種d-bus.

那我們就來看看在我們的qt應用中怎麼使用qtdbus功能。

作為伺服器端,我們需要做的工作有:

1. 申請乙個匯流排連線

2. 在匯流排連線上掛載服務,這樣其他程序才能請求該服務

3. 在掛載的服務上註冊乙個執行服務的物件

作為服務請求端,我們需要做的工作有:

a. 申請乙個匯流排連線

b. 建立乙個介面,連線到要請求的服務上

c. 正式傳送請求

我們分別來看看對應的步驟,我們應該做什麼操作

1.和a.在**上是完全一樣的。

if (!qdbusconnection::sessionbus().isconnected())
sessionbus()是乙個靜態函式,返回當前的乙個qdbusconnection連線,如果原來沒有則建立乙個.

2. 使用registerservice函式去註冊,service_name可以隨便寫,我這裡寫的是com.cuteqt.blogexample

if (!qdbusconnection::sessionbus().registerservice(service_name))
執行完這一步後,你可以使用qt帶的工具,qdbusviewer就能看到com.cuteqt.blogexample已經註冊上了

3. qtqt是我的qtqt類的幾個物件,將其註冊到匯流排上,這個提供服務的就是qtqt的類函式

qtqt qtqt;

qdbusconnection::sessionbus().registerobject("/", &qtqt, qdbusconnection::exportallslots);

b. 這一步注意service_name的名字和伺服器端的**一樣即可,可以判斷iface.isvalid()

qdbusinte***ce iface(service_name, "/", "", qdbusconnection::sessionbus());
c. 真正發出具體的匯流排服務內容請求

qdbusreplyreply = iface.call("blogurl","bug");

if (reply.isvalid())

else

我們注意這個blogurl()請求名字就是我們在伺服器端註冊物件qtqt的類函式,bug是我們傳送過去的引數

伺服器端和請求端在乙個應用裡。執行的時候將乙份可執行檔拷貝名字為client的就可以。先執行服務端,再執行client。

**就50幾行,很好理解,能演示功能。但不魯棒:)

PHP中使用Memache作為程序鎖的操作類分享

php 使用memache 作為程序鎖 class lock processlock this onlocktimeoutfunc onlocktimeoutfunc 連線memcache 伺服器 public function connect return this omemcache 向memc...

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

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

Qt執行緒中使用socket作為客戶端通訊 二

qt使用執行緒的方式有兩種,一種是上次所說的繼承qthread重新實現run 函式,在run 函式中一直迴圈處理 另一種則是繼承qobject並使用movetothread 函式將物件移到子執行緒中。由於繼承qthread方式使用的並不規範,qt官方強烈建議使用繼承qobject的方式。根據之前編寫...