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 邮件列表。我必须先注册吗?