QDbus用法实例(很好)

更新时间:2023-07-17 14:04:58 阅读: 评论:0

QDbus⽤法实例(很好)注意:
QT      += dbus
服务端参数不能是引⽤。
QString testString(QString& name)  不⾏
服务端:
#include <QObject>
#include <QDBusConnection>
#include <QDBusError>
#include <QDebug>
class CTestDbus: public QObject
{
Q_OBJECT
//定义Interface名称为com.Interface.CTestDbus
Q_CLASSINFO("D-Bus Interface", "com.Interface.CTestDbus")
public:
explicit CTestDbus(QObject* parent = nullptr):QObject(parent){}
public slots:
数学教科书QString testString(QString name)
{
QString str = "testString : " + name;
qDebug() <<"Server: " << str;
身体的秘密
emit testSignal(9);
return str;
}
signals:
void testSignal(int);
};
//建⽴到ssion bus的连接
QDBusConnection connection = QDBusConnection::ssionBus();
//在ssion bus上注册名为com.Server.Server1的服务
if(!isterService("com.Server.Server1"))
好朋友友情的话语{
qDebug() << "error:" << connection.lastError().message();
return;
}
CTestDbus *obj = new CTestDbus;
//注册名为/com/ObjectPath/CTestDbus的对象,把类Object所有槽函数和信号导出为object的method
新年祝福语
if (!isterObject("/com/ObjectPath/CTestDbus", obj,
QDBusConnection::ExportAllSlots|QDBusConnection::ExportAllSignals))
{
qDebug() << "error:" << connection.lastError().message();
return;
}
客户端:
#include <QMainWindow>
#include <QMainWindow>
#include <QDBusConnection>
#include <QDBusError>
#include <QDBusPendingCallWatcher>
#include <QDBusPendingCallWatcher>
#include <QDBusInterface>
#include <QDBusPendingReply>
小型微利企业所得税优惠政策#include <QDBusReply>
#include <QDebug>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
public:
void dbusclient();
signals:
public slots:
void testSlot(int value);
void callFinishedSlot(QDBusPendingCallWatcher *call);
};
void MainWindow::dbusclient()
{
//
#ifdef METHOD1 //远程服务调⽤⽅法⼀
//构造⼀个method_call消息,服务名称为:com.Server.Server1,对象路径为:/com/ObjectPath/CTestDbus    //接⼝名称为com.Interface.CTestDbus,method名称为testString
QDBusMessage message = QDBusMessage::createMethodCall("com.Server.Server1",
"/com/ObjectPath/CTestDbus",
"com.Interface.CTestDbus",
"testString");
// 传递参数
message << QString("lalala");
//发送消息
QDBusMessage respon = QDBusConnection::ssionBus().call(message);
//判断method是否被正确返回
if (pe() == QDBusMessage::ReplyMessage)
{
世界最长山脉//从返回参数获取返回值
QString value = respon.arguments().takeFirst().toString();
qDebug() << QString("Client get return value =  %1").arg(value);
}
el
{
白萝卜丸子汤
qDebug() << "value method called failed!";
安徒生童话书}
//
#elif METHOD2  //远程服务调⽤⽅法⼆
// 创建QDBusInterface接⼝
QDBusInterface interface("com.Server.Server1", "/com/ObjectPath/CTestDbus",
"com.Interface.CTestDbus",
QDBusConnection::ssionBus());
if (!interface.isValid())
{
qDebug() << qPrintable(QDBusConnection::ssionBus().lastError().message());
exit(1);
}
//调⽤远程的testString⽅法,第⼀个参数为lalala2222
//QDBusReply<QString>返回值类型和tName返回值类型保持⼀致
//call是同步调⽤,远程⽅法返回后才继续往下执⾏。
//call是同步调⽤,远程⽅法返回后才继续往下执⾏。
QDBusReply<QString> reply = interface.call("testString", "lalala2222"); //阻塞,直到远程⽅法调⽤完成。    if (reply.isValid())
{
QString value = reply.value();
qDebug() << QString("debus value =  %1").arg(value);
}
el
{
qDebug() << "value method called failed!";
}
//
#el// 远程服务调⽤⽅法三,异步调⽤
// 异步调⽤
// 创建QDBusInterface接⼝
QDBusInterface interface("com.Server.Server1", "/com/ObjectPath/CTestDbus",
"com.Interface.CTestDbus",
QDBusConnection::ssionBus());
if (!interface.isValid())
{
qDebug() << qPrintable(QDBusConnection::ssionBus().lastError().message());
exit(1);
}
{
// ⽅法⼀:接收服务端的信号,连接槽函数。服务器对象必须注册QDBusConnection::ExportAllSignals        //  if (!QDBusConnection::ssionBus().connect("com.Server.Server1",
//                                            "/com/ObjectPath/CTestDbus",
//                                            "com.Interface.CTestDbus",
//                                            "testSignal", this,
//                                            SLOT(testSlot(int))))
//⽅法⼆:接收服务端的信号,连接槽函数。服务器对象必须注册QDBusConnection::ExportAllSignals        QDBusInterface *pinterface = new QDBusInterface ("com.Server.Server1",
"/com/ObjectPath/CTestDbus",
"com.Interface.CTestDbus",
QDBusConnection::ssionBus());
QObject::connect(pinterface, SIGNAL(testSignal(int)), this, SLOT(testSlot(int)));
}
// 这⾥不阻塞,异步调⽤。
QDBusPendingCall async = interface.asyncCall("testString", "lalala33333");
// 等待结束,async.waitForFinished ()
QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(async, this);
QObject::connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)),
this, SLOT(callFinishedSlot(QDBusPendingCallWatcher*)));
#endif
}
void MainWindow::testSlot(int value)
{
qDebug() << "testSlot = " << value;
}
void MainWindow::callFinishedSlot(QDBusPendingCallWatcher *call)
{
QDBusPendingReply<QString> reply = *call;
if (!reply.isError()) {
QString name= reply.argumentAt<0>();
qDebug()<<"QDBusPendingReply name = "<<name;
}
call->deleteLater();
}
}

本文发布于:2023-07-17 14:04:58,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1101439.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:远程   返回   返回值   服务   函数   信号
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图