QDbus 用法實例

參考網站: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;
}
相關文章
相關標籤/搜索