问题标签 [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.
c++ - qt dbus中服务器客户端之间的通信
我是 QT 编程的新手。我正在尝试使用 DBUS 在两个 qt 应用程序之间进行通信,我已经能够创建一个接口适配器并进行如下通信,
- 在服务器应用程序上注册服务。
- 连接到客户端的接口对象并调用服务器中的方法。
我的问题是,如果服务器必须向客户端发送回消息,客户端应该创建一个新接口还是有其他方法可以做到这一点?
qt - org.freedesktop.DBus.NameLost 是什么意思?
当我的应用程序尝试调用 DBus 可激活会话总线服务时,我收到org.freedesktop.DBus.NameLost信号。
这个信号的真正含义是什么?这是否意味着应用程序不能再向 DBus 服务发送信号?
要求
发出的信号
c++ - dbus-send与QDBusAbstractInterface的对应关系
dbus-send
utility的参数和构造函数的参数和call*
方法的对应关系是QDBusAbstractInterface
什么?
互联网上有很多关于如何使用实用程序通过DBus规则NetworkManager的示例(例如[1] ) ,但我无法推断如何将它们转换为Qt C++代码。dbus-send
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 去做?
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 适配器仍将使用元类型系统和运行时检查。我们当然可以做得更好。
qt - QtDBus。如何调用以 QDBusUnixFileDescriptor 作为参数的方法
我有一个以 aQDBusUnixFileDescriptor
作为参数的 D-Bus 方法。但是我不知道如何通过总线调用这个方法。
状态的文档QDBusUnixFileDescriptor
:
这允许应用程序通过 D-Bus 连接发送和接收 Unix 文件描述符,自动映射到 D-Bus 类型“h”。
要调用我正在使用QDBusInterface::call
的其他方法,它需要方法名称和一堆QVariant
s。QVariant
没有为QDBusUnixFileDescriptor
.
我无法在 Qt 文档、github 或 google 中找到任何示例。
如何调用以 aQDBusUnixFileDescriptor
作为参数的总线方法?
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 不是强类型的,我如何指定参数必须输入为无符号整数?
c++ - QSignalSpy::wait(...) 失败,当 QTest::qWait(...) 成功时
这是一个令人困惑的情况。在测试 QStateMachine 的状态转换时,以下代码无法监视导致转换的信号。
以下代码通过了测试!
我还可以在外部验证信号是否正在使用 dbus-monitor 发出。
我可以继续使用 QTest::qWait,这没什么大不了的,但我只是对为什么 spy.wait 不起作用感到困惑。
干杯,西蒙
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 信号。但是当我将服务路径和名称更改为空字符串时,我成功接收到信号;
从命令行
干杯,西蒙
qt - Qt qdbusxml2cpp 没有输出
我想让我的应用程序向 dbus 公开函数。我为我的班级生成了以下 xml:
但是,当我尝试运行 xml2cpp 生成器时,我没有收到任何错误消息,没有输出,没有任何进程甚至没有退出。
使用详细选项时,我也没有得到任何输出。我正在使用 qdbusxml2cpp 0.8 版。
为什么该工具不执行任何操作?