參考網站:https://www.jianshu.com/p/438c9d2594f1服務器
服務端:session
test.h #ifndef TEST_H #define TEST_H #include <QObject> class test: public QObject { Q_OBJECT //定義Interface名稱爲com.scorpio.test.value Q_CLASSINFO("D-Bus Interface", "com.scorpio.test.value") public: test(int value); public slots: int maxValue(); int minValue(); int value(); QString setName(QString name); signals: void signals_process_value(int); private: int m_value; QString m_name; }; #endif // TEST_H
test.cpp #include "test.h" #include <QDebug> #include <QThread> test::test(int value) { m_value = value; } int test::maxValue() { return 100; } int test::minValue() { return 0; } int test::value() { return m_value; } QString test::setName(QString name) { m_name = name; qDebug() << "setname= " <<name; for (int i = 1; i < 5; i++) { emit signals_process_value(i); QThread::sleep(1); } return name; }
main.cpp void MainWindow::dbusServer() { //創建到session bus的鏈接 QDBusConnection connection = QDBusConnection::sessionBus(); //在session bus上註冊名爲com.scorpio.test的服務 if(!connection.registerService("com.scorpio.test")) { qDebug() << "error:" << connection.lastError().message(); return; } test *object = new test(60); //註冊名爲/test/objects的對象,把類Object全部槽函數和信號導出爲object的method if (!connection.registerObject("/home/lyb/objects", object,QDBusConnection::ExportAllSlots|QDBusConnection::ExportAllSignals)) { qDebug() << "error:" << connection.lastError().message(); return; } }
客戶端:異步
MainWindow .h class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); void dbusclient(); public slots: void slots_process_value(int); private: Ui::MainWindow *ui; };
MainWindow.cpp //#define METHOD1 void MainWindow::dbusclient() { ////////////////////////////////////////////////////////////////////////////// #ifdef METHOD1 //遠程服務調用方法一 //構造一個method_call消息,服務名稱爲:com.scorpio.test,對象路徑爲:/test/objects //接口名稱爲com.scorpio.test.value,method名稱爲value QDBusMessage message = QDBusMessage::createMethodCall("com.scorpio.test", "/home/lyb/objects", "com.scorpio.test.value", "setName"); // 傳遞參數 message << QString("wangjian"); //發送消息 QDBusMessage response = QDBusConnection::sessionBus().call(message); //判斷method是否被正確返回 if (response.type() == QDBusMessage::ReplyMessage) { //從返回參數獲取返回值 QString value = response.arguments().takeFirst().toString(); qDebug() << QString("dbus value = %1").arg(value); } else { qDebug() << "value method called failed!"; } ////////////////////////////////////////////////////////////////////////////// #elif METHOD2 //遠程服務調用方法二 // 建立QDBusInterface接口 QDBusInterface interface("com.scorpio.test", "/home/lyb/objects", "com.scorpio.test.value", QDBusConnection::sessionBus()); if (!interface.isValid()) { qDebug() << qPrintable(QDBusConnection::sessionBus().lastError().message()); exit(1); } //調用遠程的setName方法,第一個參數爲testname //QDBusReply<QString>返回值類型和setName返回值類型保持一致 //call是同步調用,遠程方法返回後才繼續往下執行。 QDBusReply<QString> reply = interface.call("setName", "testname"); //阻塞,直到遠程方法調用完成。 if (reply.isValid()) { QString value = reply.value(); qDebug() << QString("debus value = %1").arg(value); } else { qDebug() << "value method called failed!"; } ////////////////////////////////////////////////////////////////////////////// #else// 遠程服務調用方法三,異步調用 // 異步調用 // 建立QDBusInterface接口 QDBusInterface interface("com.scorpio.test", "/home/lyb/objects", "com.scorpio.test.value", QDBusConnection::sessionBus()); if (!interface.isValid()) { qDebug() << qPrintable(QDBusConnection::sessionBus().lastError().message()); exit(1); } { // 方法一:接收服務端的信號,鏈接槽函數。服務器對象必須註冊QDBusConnection::ExportAllSignals // if (!QDBusConnection::sessionBus().connect("com.scorpio.test", "/home/lyb/objects", // "com.scorpio.test.value", // "signals_process_value", this, // SLOT(slots_process_value(int)))) //方法二: 接收服務端的信號,鏈接槽函數。服務器對象必須註冊QDBusConnection::ExportAllSignals QDBusInterface *pinterface = new QDBusInterface ("com.scorpio.test", "/home/lyb/objects", "com.scorpio.test.value",QDBusConnection::sessionBus()); QObject::connect(pinterface, SIGNAL(signals_process_value(int)), this, SLOT(slots_process_value(int))); } // 這裏不阻塞,異步調用。 QDBusPendingCall async = interface.asyncCall("setName", "Brion"); // 等待結束,async.waitForFinished () QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(async, this); QObject::connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), this, SLOT(callFinishedSlot(QDBusPendingCallWatcher*))); #endif } void MainWindow::callFinishedSlot(QDBusPendingCallWatcher *call) { QDBusPendingReply<QString> reply = *call; if (!reply.isError()) { QString name= reply.argumentAt<0>(); qDebug()<<"QDBusPendingReply name = "<<name; } call->deleteLater(); } void MainWindow::slots_process_value(int value) { qDebug() << "slots_process_value = " << value; }