PyQt5 dbus:将信号参数的类型签名强制为字符串数组
PyQt5 dbus: Force type signature of signal argument to be array of string
我正在写一个 MPRIS 播放器,它通过
总线。当我的播放状态改变时,我需要发出一个信号。然而,
信号需要 (sa{sv}as)
的格式,我的代码正在生成
(sa{sv}av)
。这是重要的部分:
self.signal = QDBusMessage.createSignal(
"/org/mpris/MediaPlayer2",
"org.freedesktop.DBus.Properties",
"PropertiesChanged"
)
self.signal.setArguments(
[interface, {property: values}, ['']]
)
问题出在给定参数列表中的第三项。这是
列表中的空字符串,因为我需要生成一种“数组”
字符串' (as
) 但 pyqt5 将其转换为 'array of variant' (av
).
我从不需要在该列表中放入任何实际数据,我只需要类型
签名要正确。
在 PyQt5 中有什么方法可以做到这一点吗?也许使用 QDBusArgument?
我...我成功了。哇。那是一场运动。
我不知道到底出了什么问题,我无法从 PyQt5 源代码中挖掘出转换发生的确切位置。但是,我确实调查了 QDbusArgument()
。 python 中没有这方面的文档,而且由于存在重大差异,C++ 文档毫无价值,所以我找到了源代码。在 sip/QtDbus/qdbusargument.sip
中,我发现了一个 完全没有记录的 新方法,叫做 qdbusargument_add
。这映射到 python 中的 QDbusArgument().add()
。它用于将具有 显式类型 id 的参数添加到 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 邮件列表。我必须先注册吗?
我正在写一个 MPRIS 播放器,它通过
总线。当我的播放状态改变时,我需要发出一个信号。然而,
信号需要 (sa{sv}as)
的格式,我的代码正在生成
(sa{sv}av)
。这是重要的部分:
self.signal = QDBusMessage.createSignal(
"/org/mpris/MediaPlayer2",
"org.freedesktop.DBus.Properties",
"PropertiesChanged"
)
self.signal.setArguments(
[interface, {property: values}, ['']]
)
问题出在给定参数列表中的第三项。这是
列表中的空字符串,因为我需要生成一种“数组”
字符串' (as
) 但 pyqt5 将其转换为 'array of variant' (av
).
我从不需要在该列表中放入任何实际数据,我只需要类型 签名要正确。
在 PyQt5 中有什么方法可以做到这一点吗?也许使用 QDBusArgument?
我...我成功了。哇。那是一场运动。
我不知道到底出了什么问题,我无法从 PyQt5 源代码中挖掘出转换发生的确切位置。但是,我确实调查了 QDbusArgument()
。 python 中没有这方面的文档,而且由于存在重大差异,C++ 文档毫无价值,所以我找到了源代码。在 sip/QtDbus/qdbusargument.sip
中,我发现了一个 完全没有记录的 新方法,叫做 qdbusargument_add
。这映射到 python 中的 QDbusArgument().add()
。它用于将具有 显式类型 id 的参数添加到 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 邮件列表。我必须先注册吗?