我正在编写一个 MPRIS 播放器,它通过以下方式与客户进行通信
dbus。当我的播放状态发生变化时,我需要发出一个信号。然而,
信号需要的格式为(sa{sv}as)
,我的代码正在生成(sa{sv}av)
。这是重要的部分:
self.signal = QDBusMessage.createSignal(
"/org/mpris/MediaPlayer2",
"org.freedesktop.DBus.Properties",
"PropertiesChanged"
)
self.signal.setArguments(
[interface, {property: values}, ['']]
)
问题是给 setArguments 的列表中的第三项。这是
列表中的空字符串,因为我需要生成一种“数组”类型
字符串'(as
)但 pyqt5 将其转换为“变体数组”(av
).
我不需要在该列表中放入任何实际数据,我只需要类型
签名要正确。
PyQt5 有什么办法可以做到这一点吗?也许使用 QDBusArgument?
我...我成功了。哇。那是一场运动。
我不知道到底出了什么问题,我无法从 PyQt5 源代码中挖掘出转换发生的具体位置。不过,我确实调查过QDbusArgument()
。 python 中没有这方面的文档,并且由于存在重大差异,C++ 文档毫无价值,因此我采用了源代码。在sip/QtDbus/qdbusargument.sip
,我发现了一个完全无证新方法称为qdbusargument_add
。这映射到QDbusArgument().add()
在Python中。它用于添加参数显式类型 ID to a QDbusArgument
。它有一个特殊情况为QStringList
!
从那时起,我就用暴力强行论证我能想到的每一种可能性QDbusArgument()
,最终得到如下结果:
def PropertiesChanged(self, interface, property, values):
"""Sends PropertiesChanged signal through sessionBus.
Args:
interface: interface name
property: property name
values: current property value(s)
"""
emptyStringListArg = QDBusArgument()
emptyStringListArg.add([""], QMetaType.QStringList)
self.signal.setArguments([interface, {property: values}, emptyStringListArg])
QDBusConnection.sessionBus().send(self.signal)
如果add()
函数可以被记录下来,但我似乎无法向 PyQt5 邮件列表发送消息。我必须先注册吗?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)