Qt+DBUS的signal服务提供以及客户端接受信号

 目录

 服务端编写

客户端接受signal信号


QT中dbus的signal信号算是一种服务器给客户端主动发送消息的服务,比如当系统U盘被拔除时。

 服务端编写

创建dbus的signal信息如下:

path:/citos/path

interface:com.citos.test

member:send_to_client

  • myserver.cpp
#include "myservice.h"
#include 
MyService::MyService(QObject *parent) : QObject(parent)
{
    QDBusConnection::sessionBus().unregisterService("com.citos.service");
    QDBusConnection::sessionBus().registerService("com.citos.service");
    QDBusConnection::sessionBus().registerObject("/citos/path", this,QDBusConnection :: ExportAllSlots | QDBusConnection :: ExportAllSignals);
    QDBusConnection::sessionBus().connect(QString(), QString("/citos/path"), "com.citos.test", "send_to_service", this, SLOT(service_get(QString)));

}
  • myserver.h
#ifndef MYSERVICE_H
#define MYSERVICE_H

#include 

class MyService : public QObject
{
    Q_OBJECT
public:
    explicit MyService(QObject *parent = nullptr);
     Q_CLASSINFO("D-Bus Interface", "com.citos.test")
signals:
    void send_to_client(QString);
public slots:
};

#endif // MYSERVICE_H

发送该信号 emit server.send_to_client("你好");

  • mainwindow.cpp
#include "mainwindow.h"
#include 

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    ,m_btn ( new QPushButton("按钮",this))
{
    connect(m_btn,&QPushButton::clicked,this,&MainWindow::clickBtn);
}

MainWindow::~MainWindow()
{

}

void MainWindow::clickBtn()
{
    qInfo()<<"nihao";

    emit server.send_to_client("你好");
}

客户端接受signal信号

myserver.cpp

#include "myserver.h"
#include 
#include 
Myserver::Myserver(QObject *parent) : QObject(parent)
{
    QDBusConnection::sessionBus().connect(QString(), QString("/citos/path"), "com.citos.test",\
     "send_to_client", this, SLOT(service_get(QString)));

}

void Myserver::service_get(QString str)
{
    qInfo()<

myserver.h

#ifndef MYSERVER_H
#define MYSERVER_H

#include 

class Myserver : public QObject
{
    Q_OBJECT
public:
    explicit Myserver(QObject *parent = nullptr);

signals:

public slots:
    void service_get(QString str);
};

#endif // MYSERVER_H

这样,当在主窗口的按钮被点击时,服务端会发出 send_to_client 信号,客户端接收到信号后调用 service_get 槽函数进行处理。您可以根据需要添加更多的信号和槽函数。

D-Bus 是一种用于进程间通信的机制,允许不同进程之间通过消息传递进行通信。它使用了一种称为 "信号和槽" 的机制,其中一个进程可以发送信号,而其他进程可以连接到该信号并处理它。

在上述代码中,服务端注册了一个名为 "com.citos.service" 的 D-Bus 服务,提供了一个名为 "/citos/path" 的对象。客户端通过连接到该对象上的 "send_to_client" 信号来接收服务端发送的消息。

值得注意的是,D-Bus 在跨进程通信时需要依赖系统的 D-Bus 服务运行。在运行代码之前,请确保您的系统已正确安装和配置了 D-Bus 服务。

代码地址如下:Qt+signal · master · 三雷科技 / QT博客案例 · GitCode

你可能感兴趣的:(QT小王子,qt,开发语言,DBUS)