PyQt5 dbus:强制信号参数的类型签名为字符串数组

问题描述 投票:0回答:1

我正在编写一个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?

python qt pyqt5 dbus
1个回答
0
投票

我...我知道了。哇。那是一场运动。

我不知道到底出了什么问题,我无法从发生转换的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邮件列表。我必须先注册吗?

© www.soinside.com 2019 - 2024. All rights reserved.