【问题标题】:Defining Enum custom types for Qt D-Bus introspection为 Qt D-Bus 自省定义 Enum 自定义类型
【发布时间】:2013-07-03 12:45:13
【问题描述】:

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

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

这里不解释要在 QTDBUS interospection xml 中指定使用 qdbusxml2cpp 生成代理的注解。

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

如果可能的话,请用一些示例代码解释一下。

【问题讨论】:

    标签: dbus qdbus


    【解决方案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 文件,我们可以简单地创建我们的适配器和接口类。

    在我们的 ma​​in.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
    

    【讨论】:

    • 那么,如何在 pro 文件中指定,以便生成的源文件包含特定的标头?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 2012-01-04
    • 1970-01-01
    相关资源
    最近更新 更多