若該文爲原創文章,未經允許不得轉載
原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客導航:https://blog.csdn.net/qq21497936/article/details/102478062
本文章博客地址:http://blog.csdn.net/qq21497936/article/details/77834743
各位讀者,知識無窮而人力有窮,要麼改需求,要麼找專業人士,要麼自己研究
紅胖子(紅模仿)的博文大全:開發技術集合(包含Qt實用技術、樹莓派、三維、OpenCV、OpenGL、ffmpeg、OSG、單片機、軟硬結合等等)持續更新中...(點擊傳送門)
Qt開發專欄:開發技術(點擊傳送門)
背景介紹
這幾天,在開發VOI(Virtual OS Infrastructure)登錄界面,爲後續工作更好的開展和項目維護,將界面邏輯與功能實現分開,因涉及到登錄認證鏡像快照等後續持續性交互,採用QDBus。
[題外話:若只是一個簡答的登錄的界面,可使用QProcess調用腳本,等待腳本返回值來判斷登錄成功或者失敗]
背景不多說,下面開說,若有不對,請留言指正,歡迎探討,共同進步,謝謝!!!
QDBus基本介紹
DBus分爲兩種類型:
- system bus(系統總線),用於系統(Linux)和用戶程序之間進行通信和消息的傳遞;
- session bus(回話總線),用於桌面(GNOME, KDE等)用戶程序之間進行通信。
QDBus之服務端
服務器端分爲兩步,
第一步:註冊服務;
第二步:註冊對象,導入槽函數
下面是註冊服務器對象的代碼:
服務端運行成功後,會在系統DBus總線上註冊服務,打開D-Feet軟件查看是否註冊成功,如下圖:
可以看到註冊的服務名稱,路徑,接口名稱,方法名稱,而DbusHandler類的頭文件如下圖:
由上圖可知,4個槽函數都被註冊到DBUS中,這主要是註冊對象時使用的參數,如下圖:
QDBus之客戶端
客戶端我們使用了兩種方式(共三種)可以與服務器端通訊,分別:
- 使用QDBusMessage
- 使用QDBusInterface
客戶端的頭文件代碼如下:
其中尤爲重要的是服務器的名稱,服務器的地址,方法名稱,[參數],具體的實現方式見下圖代碼:
以上是不帶返回參數的客戶端代碼,這裏注意的是如果要寫接口名稱,則必須按照“local.進程名.對象名”作爲接口名稱(註冊多個對象具有相同的函數名就需要接口了),此次調試的系統爲ubuntu16.04;如果不寫接口名即爲空(“”),則直接匹配接口名。
下圖爲帶返回參數的客戶端代碼:
QDBus之服務端D-Feet調試
可能在寫服務器的時候,需要模仿客戶端發送指令,這時候D-Feet就用上了,運行服務端後,打開D-Feet,D-Feet界面如下圖:
雙擊“Methods”下的方法,即可彈出該方法的對話框,在數據裏面直接輸入,點擊“Execute”即可執行,並可獲得方法調用的返回值,如下圖:
QDBus之調試信息工具dbus-monitor
使用該工具,可查看到相關執行的結果以及原因,之前一直使用接口名稱連接不上,使用調試信息後知道,接口名稱的規則是:“local.進程名.對象名”,使用過程也很簡單,直接在Terminal使用命令“dbus-monitor | grep 服務名”, 下圖是之前本人調試使用接口名調用失敗的原因:
由上圖可知,沒有找到接口名“voi.server.QDBusHandler”,使用D-Feet即可知道事實上的接口名如下圖:
作者白話
此次使用QDBus結束,後面若有補充會直接緊接此處往後寫,同時寫博客格式不好調整,故先使用word寫完原稿,然後將其截圖傳上博客。
若有錯誤處,請各位批評指正,謝謝!
原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客導航:https://blog.csdn.net/qq21497936/article/details/102478062
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/77834743