- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在 C++ 中使用 qt dbus 绑定(bind)。
目前我可以通过 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"
,你可以找到这个头文件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;
}
}
现在让我们生成接口(interface)描述(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 文件,我们可以简单地创建我们的适配器和接口(interface)类。
在我们的 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
关于c++ - QtDBUS:通过 DBUS 发送枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19135101/
我想在 Qt Creator 中使用 Qt Dbus 在系统总线上公开我的应用程序的方法。 在使用 session 总线时,方法会暴露出来,但是使用系统总线时,我只能看到我注册的服务名称,但没有方法可
我必须在 Qt 中实现一个 DBus 服务,该服务必须返回符合给定规范的相当复杂的数据。数据本质上是一系列经过测试的映射、数组、结构和其他变体。 我找不到一种方便的方法将所有这些打包到我的方法的回复中
我在 C++ 中使用 qt dbus 绑定(bind)。 目前我可以通过 dbus 发送任何自定义类型(例如:类、结构),但我无法发送枚举。 I also tried this link here,
我正在使用 qt-dbus 从我的软件中公开一些 API。 我将带有接口(interface)声明的 foo.xml 转换为 foo_adaptor.cpp 和 foo_adaptor.h 通过 qd
我想在 QtDbus 上注册一个接口(interface)和方法。 在 glib Dbus 中我们有一个方法 g_dbus_register_interface(.. ,.. , .., ..). 有
我有一个用 Qt 编写的应用程序,它使用 QtDBus。我需要将它移植到 android 上。对这两种技术都没有太多经验。 当我尝试为 android 编译我的 Qt 应用程序时,出现错误: fata
当我运行 Qt Creator dbus 示例时,它们无法运行,是否有工作 QtDbus 模块的任何设置或内容或任何先决条件? 例如在chat项目中: if (!QDBusConnection::se
我是一名优秀的程序员,十分优秀!