gpt4 book ai didi

c++ - QtDBUS:通过 DBUS 发送枚举

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:54:28 26 4
gpt4 key购买 nike

我在 C++ 中使用 qt dbus 绑定(bind)。

目前我可以通过 dbus 发送任何自定义类型(例如:类、结构),但我无法发送枚举。

I also tried this link here, but I do not get it

最佳答案

我找到了解决问题的办法:

首先创建一个名为 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.henums.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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com