为Qt D-Bus内省定义枚举自定义类型

时间:2013-07-05 12:01:41

标签: dbus qdbus

我正在使用QDBUS,其自定义类型为Enum。谷歌搜索后,我发现下面的链接解释了QDBUS自定义类型的编组。

http://techbase.kde.org/Development/Tutorials/D-Bus/CustomTypes#Adventurous_serialization_of_enumerations

这并不能解释在QTDBUS interospection xml中使用qdbusxml2cpp生成代理的注释。

如何在QTDBUS interospection xml中添加Enum注释?

请尽可能用一些示例代码解释。

1 个答案:

答案 0 :(得分: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.h和 enums.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