QtDBUS:通过 DBUS 发送枚举

Posted

技术标签:

【中文标题】QtDBUS:通过 DBUS 发送枚举【英文标题】:QtDBUS: Send Enums over DBUS 【发布时间】:2013-10-08 17:30:23 【问题描述】:

我在 c++ 中使用 qt dbus 绑定。

目前我可以通过 dbus 发送任何自定义类型(例如:类、结构),但我无法发送枚举。

I also tried this link here, but I do not get it

【问题讨论】:

【参考方案1】:

我找到了解决问题的方法:

首先创建一个名为enums.h 的新头文件,如下所示:

#ifndef ENUMS_H
#define ENUMS_H

#include <QtDBus>
#include "enumDBus.h"

enum Color 
    RED = 0,
    BLUE,
    GREEN
;

Q_DECLARE_METATYPE(Color)

#endif  /* ENUMS_H */

注意下面的#include "enumDBus.h"行,你可以找到这个头文件here。

所以在你声明了枚举之后,你可以声明一个以枚举为参数的方法,在这个例子中,我在calculator.h中声明了以下方法:

void setColor(Color color);

此方法的实现:

void Calculator::setColor(Color c)

    switch (c) 
    case BLUE: std::cout << "Color: blue" << std::endl;
        break;
    case GREEN: std::cout << "Color: green" << std::endl;
        break;
    case RED: std::cout << "Color: reed" << std::endl;
        break;
    default:
        std::cout << "Color: FAIL!" << std::endl;
    

现在让我们生成接口描述(XML),使用以下命令

qdbuscpp2xml -M -s calculator.h -o com.meJ.system.CalculatorInterface.xml

包含自定义类型的方法的生成不能正常工作,所以我们需要做一些调整:

<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node>
  <interface name="com.meJ.system.CalculatorInterface">
    <method name="setColor">
        <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="Color"/>
        <arg type="(i)" direction="in" name="c"/>
    </method>
  </interface>
</node>

使用这个 XML 文件,我们可以简单地创建我们的适配器和接口类。

在我们的main.cpp(在客户端和服务器上!)我们必须注册我们的自定义类型:

int main(int argc, char** argv)

    qRegisterMetaType<Color>("Color");
    qDBusRegisterMetaType<Color>();

客户端

在您的main.cpp 中包含生成的calculatorInterface.henums.h

现在您可以简单地调用您的方法:

int main(int argc, char** argv)

    qRegisterMetaType<Color>("Color");
    qDBusRegisterMetaType<Color>();

    QDBusConnection dbus = QDBusConnection::sessionBus();

    com::meJ::system::CalculatorInterface *calculator = new com::meJ::system::CalculatorInterface("com.meJ.system", "/Calc", dbus);
    if (calculator->isValid() == false) 
        cerr << "ERROR: " << qPrintable(calculator->lastError().message()) << endl;
        exit(1);
    

    Color c = GREEN;
    calculator->setColor(c);
    std::cout << qPrintable(calculator->lastError().message()) << std::endl;

    exit(0);

如果一切正常,您应该在服务器程序中看到以下输出:

~# Color: green

【讨论】:

【参考方案2】:

这是我的解决方案,它使用宏并且没有增强依赖性。 您需要在头文件中编写以下语句来声明 > 运算符。

例如:

DECLARE_ENUM_DATATYPE(QProcess::ProcessState)

并在一个 .cpp 文件中添加以下语句来定义 > 运算符。

CREATE_ENUM_DATATYPE(QProcess::ProcessState)

以上两个函数都需要下面的文件,你可以把它保存为 enumDBus.hpp

#ifndef _ENUM_DBUS_HPP
#define _ENUM_DBUS_HPP

#include <QtDBus/QDBusArgument>

#define DECLARE_ENUM_DATATYPE(ENUM_TYPE_DBUS)\
     QDBusArgument &operator<<(QDBusArgument &argument, ENUM_TYPE_DBUS value);\
     const QDBusArgument &operator>>(const QDBusArgument &argument, ENUM_TYPE_DBUS &val);


#define CREATE_ENUM_DATATYPE(ENUM_TYPE_DBUS)\
     QDBusArgument &operator<<(QDBusArgument &argument, ENUM_TYPE_DBUS value)\
     \
         argument.beginStructure();\
         qlonglong newVal = (qlonglong)value;\
         argument << newVal;\
         argument.endStructure();\
         return argument;\
     \
     const QDBusArgument &operator>>(const QDBusArgument &argument, ENUM_TYPE_DBUS &val)\
     \
         argument.beginStructure();\
         qlonglong result = 0;\
         argument >> result;\
         val = (ENUM_TYPE_DBUS)result;\
         argument.endStructure();\
         return argument;\
     

#endif //_ENUM_DBUS_HPP

【讨论】:

以上是关于QtDBUS:通过 DBUS 发送枚举的主要内容,如果未能解决你的问题,请参考以下文章

dbus和qtdbus

dbus和qtdbus

如何从 Python 将无符号值发送到 dBus

使用 QtDBus 支持构建 Qt 4.8

连接到不同计算机上的会话 DBus

Qt DBus没有收到信号