我正在使用QDBUS,它的自定义类型为Enum。在谷歌上搜索后,我发现下面的链接解释了QDBUS自定义类型的编组。
http://techbase.kde.org/Development/Tutorials/D-Bus/CustomTypes#Adventurous_serialization_of_enumerations
这并没有解释要在QTDBUS互检查xml中指定的注释,以便使用qdbusxml2cpp生成代理。
如何在QTDBUS互操作xml中添加枚举注释?
如果可能的话,请用一些示例代码进行解释。
我找到了解决问题的方法:
首先创建一个名为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",您可以在这里找到这个头文件!
因此,在您声明了枚举之后,您可以声明一个以枚举为参数的方法,在本例中,我在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