问题标签 [qtdbus]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
659 浏览

c++ - qt dbus中服务器客户端之间的通信

我是 QT 编程的新手。我正在尝试使用 DBUS 在两个 qt 应用程序之间进行通信,我已经能够创建一个接口适配器并进行如下通信,

  • 在服务器应用程序上注册服务。
  • 连接到客户端的接口对象并调用服务器中的方法。

我的问题是,如果服务器必须向客户端发送回消息,客户端应该创建一个新接口还是有其他方法可以做到这一点?

0 投票
0 回答
1026 浏览

qt - org.freedesktop.DBus.NameLost 是什么意思?

当我的应用程序尝试调用 DBus 可激活会话总线服务时,我收到org.freedesktop.DBus.NameLost信号。

这个信号的真正含义是什么?这是否意味着应用程序不能再向 DBus 服务发送信号?

要求

发出的信号

0 投票
1 回答
153 浏览

c++ - dbus-send与QDBusAbstractInterface的对应关系

dbus-sendutility的参数和构造函数的参数和call*方法的对应关系是QDBusAbstractInterface什么?

互联网上有很多关于如何使用实用程序通过DBus规则NetworkManager的示例(例如[1] ) ,但我无法推断如何将它们转换为Qt C++代码。dbus-send

0 投票
1 回答
725 浏览

c++ - 从 dbus xml 生成文件时,如何告诉 qmake 包含标头?

TLDR:我如何告诉 qmake 使用 dbus xml 描述生成文件,其中包括适当的标头?

完整示例和更多信息如下。


我描述 dbus 接口的 xml 文件 (custom.xml) 如下所示:

pro 文件 (ex.pro) 如下所示:

头文件(Info.hpp):

和源文件(Info.cpp):

当我尝试创建 Makefile 并构建库时,它失败了,因为生成的文件中的类型未知,因为生成的文件不包括Info.hpp

pro文件中我使用什么选项,所以生成的头文件包含Info.hpp?

我知道qdbusxml2cpp包含一个带有-i选项的标题。如何告诉 qmake 去做?

0 投票
1 回答
572 浏览

qt - 我们可以生成抽象的 Qt D-Bus 适配器类吗?

我正在使用该工具为我的 D-Bus 服务器qdbusxml2cpp生成D-Bus 适配器类。但是,它有以下缺点:

  • 代码生成一次,然后你不应该修改它。但是如果我们必须进行更改(见下文)然后 XML 更改(当然以向后兼容的方式)怎么办?

  • 假设“适配者”具有与 D-Bus 接口完全相同的功能和签名。就我而言,这并不完全正确,例如,某些方法的名称不同。因为生成的代码使用QMetaObject::invokeMethod,这仅在运行时被检测到。如果将来可能需要重新生成生成的代码,我们也不能明智地修改它。

qdbusxml2cpp在我看来,如果能生成一个抽象类,只是一个标题,其中所有方法都是纯虚拟的,那就更好了。然后我可以编写该类的实现,它只调用适配者上的正确方法,而无需通过 Qt 元类型系统。这解决了两个问题:

  • 如果 XML 发生变化,我们只需重新生成标头。现在编译器会抱怨,直到我们正确实现新接口。

  • 我们可以自由地在“adaptee”类上调用我们喜欢的任何函数,而不是维护与公共 D-Bus 接口中完全相同的签名。

我找不到qdbusxml2cpp执行上述操作的任何工具或叉子。在我自己编写之前,上述方法是否存在我可能忽略的设计或技术问题?也许与抽象类或纯虚函数相关的元类型系统的限制?

请注意,我不仅需要使用方法,还需要使用属性和信号。

我还考虑编写一个“中间”适配器来包装“适配器”并提供 D-Bus 适配器所期望的确切接口,但 D-Bus 适配器仍将使用元类型系统和运行时检查。我们当然可以做得更好。

0 投票
1 回答
152 浏览

qt - QtDBus。如何调用以 QDBusUnixFileDescriptor 作为参数的方法

我有一个以 aQDBusUnixFileDescriptor作为参数的 D-Bus 方法。但是我不知道如何通过总线调用这个方法。

状态的文档QDBusUnixFileDescriptor

这允许应用程序通过 D-Bus 连接发送和接收 Unix 文件描述符,自动映射到 D-Bus 类型“h”。

要调用我正在使用QDBusInterface::call的其他方法,它需要方法名称和一堆QVariants。QVariant没有为QDBusUnixFileDescriptor.

我无法在 Qt 文档、github 或 google 中找到任何示例。

如何调用以 aQDBusUnixFileDescriptor作为参数的总线方法?

0 投票
1 回答
242 浏览

python - 如何从 Python 将无符号值发送到 dBus

我正在尝试使用 PyQt5 的 DBus 模块与 KDE PowerManagerAgent 进行交互。调用 AddInhibition 方法时,我需要将第一个参数作为 uint32(无符号整数)发送,但代码将值作为单整数整数发送。

代码使用 Python 3 编写

查看 dbus-monitor 的输出,我可以看出代码确实联系了 powermonitor,但由于第一个参数的类型为 int32,因此无法找到正确的 AddInhibition 方法

尝试调用 AddInhibition 时 dbus-monitor 的输出

称呼

方法调用时间=1549706946.073218 发件人=:1.172 -> 目的地=org.kde.Solid.PowerManagement.PolicyAgent 串行=5 路径=/org/kde/Solid/PowerManagement/PolicyAgent;接口=org.kde.Solid.PowerManagement.PolicyAgent;member=AddInhibition int32 1 字符串“这个”字符串“失败”

回复

错误时间=1549706946.073536 发件人=:1.29 -> 目的地=:1.172 error_name=org.freedesktop.DBus.Error.UnknownMethod reply_serial=5 字符串“在接口 'org.kde.Solid.PowerManagement.PolicyAgent' 中没有这样的方法 'AddInhibition'对象路径'/org/kde/Solid/PowerManagement/PolicyAgent'(签名'iss')"

使用 QDBusViewer 应用程序时 dbus-monitor 的输出

称呼

方法调用时间=1549723045.320128 发件人=:1.82 -> 目的地=org.kde.Solid.PowerManagement.PolicyAgent 串行=177 路径=/org/kde/Solid/PowerManagement/PolicyAgent;接口=org.kde.Solid.PowerManagement.PolicyAgent;member=AddInhibition uint32 1 字符串“This” 字符串“Works”

回复

方法返回时间=1549723045.320888 发件人=:1.29 -> 目的地=:1.82 序列=1370 回复序列=177 uint32 30

由于 Python 不是强类型的,我如何指定参数必须输入为无符号整数?

0 投票
1 回答
673 浏览

c++ - QSignalSpy::wait(...) 失败,当 QTest::qWait(...) 成功时

这是一个令人困惑的情况。在测试 QStateMachine 的状态转换时,以下代码无法监视导致转换的信号。

以下代码通过了测试!

我还可以在外部验证信号是否正在使用 dbus-monitor 发出。

我可以继续使用 QTest::qWait,这没什么大不了的,但我只是对为什么 spy.wait 不起作用感到困惑。

干杯,西蒙

0 投票
0 回答
1005 浏览

c++ - QtDBus,使用 QT DBus xml 接口时未从 dbus-send 接收信号

系统信息:

  • QT5.10
  • Ubuntu 16.04

使用 QtDBus,并使用以下 XML,我生成了 xyz_interface.hpp

创建接口后,连接接口的信号;

当通过命令行使用dbus-send从 Xyz 发送信号时,我无法触发函数SomeClass::HandleEvents内的断点;

使用dbus-monitor --system,我可以看到信号正在正确发出。

然后,在单元测试中,我创建了一个测试信号:

那也未能触发断点。

在寻找解决方案数小时后,我放弃并创建了一些假的 python dbus 服务,这些服务在命令上发出事件信号(替换为 dbus-send),瞧……触发了断点并捕获了信号!(没有对 QT dbus 代码进行一次更改)

我能够接收从 python 代码发出的信号这一事实让我认为我的dbus-send --system --type=signal格式错误,但似乎无法修复它。

这是python代码;

更新

我刚刚发现,如果我为路径和名称创建空字符串的接口,那么我能够接收命令行dbus-send 发送的信号

上面的单元测试也通过了。

但现在我无法调用AuthenticateUser方法!这很令人困惑

更新 2

我能够通过此处找到的 QT 提供的 RemoteControlledCar dbus 示例重现该问题;https://code.qt.io/cgit/qt/qtbase.git/tree/examples/dbus/remotecontrolledcar?h=5.10

在controller.cpp 的构造函数中,我添加了以下内容;

使用 dbus-send 触发信号时,不会打印消息 hello 信号。但是当我将服务路径和名称更改为空字符串时,我成功接收到信号;

从命令行

干杯,西蒙

0 投票
1 回答
115 浏览

qt - Qt qdbusxml2cpp 没有输出

我想让我的应用程序向 dbus 公开函数。我为我的班级生成了以下 xml:

但是,当我尝试运行 xml2cpp 生成器时,我没有收到任何错误消息,没有输出,没有任何进程甚至没有退出。

使用详细选项时,我也没有得到任何输出。我正在使用 qdbusxml2cpp 0.8 版。

为什么该工具不执行任何操作?