QtDBUS:通过DBUS发送枚举
QtDBUS: Send Enums over DBUS
我在 c++ 中使用 qt dbus 绑定。
目前,我可以通过dbus发送任何自定义类型(例如:类,结构(,但我无法发送枚举。
我也在这里尝试了这个链接,但我没有得到它
我找到了解决问题的方法:
首先创建一个名为 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
这是我的解决方案,它使用宏并且没有提升依赖性。您需要在头文件中编写以下语句来声明<<和>>运算符。
例如:
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
相关文章:
- 不带大括号的枚举形式
- 枚举环境变量的惯用C++14/C++17方法
- 类似枚举的计算常量
- 如何正确实现和访问运算符的各种自定义枚举器
- 错误:从"int"到枚举c++的转换无效
- C++中构造函数中的枚举
- 访问在 C++ 结构中声明的枚举变量
- 枚举类'classname'的多重定义
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- typedef 枚举和枚举类有什么区别?
- 为什么我的开关/机箱在使用枚举时默认?
- 标准::可选枚举的比较运算符
- C++两个源文件之间共享的枚举的静态实例
- 打印没有铸件的枚举可以在C++中吗?
- 枚举成员与静态 int 成员?
- C++:枚举:错误:应使用标识符而不是"}"
- 带有 c++ 的枚举(输入检查)
- 在 qml 中使用 Q_ENUM 和 Q_PROPERTY 作为枚举类
- 为什么 int 类型的枚举类值不能用作 int
- QtDBUS:通过DBUS发送枚举