我正在编写一个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的列表中的第三项。它是列表中的一个空字符串,因为我需要产生一种'array字符串”(as
),但pyqt5会将其转换为“变量数组”(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邮件列表。我必须先注册吗?