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

Posted

技术标签:

【中文标题】PyQt5 dbus:强制信号参数的类型签名为字符串数组【英文标题】:PyQt5 dbus: Force type signature of signal argument to be array of string 【发布时间】:2020-04-22 12:26:39 【问题描述】:

我正在编写一个 MPRIS 播放器,它通过以下方式与客户端通信 总线。当我的播放状态发生变化时,我需要发出一个信号。然而, 信号需要(sasvas) 的格式,我的代码正在生成 (sasvav)。这是重要的部分:

self.signal = QDBusMessage.createSignal(
   "/org/mpris/MediaPlayer2",
   "org.freedesktop.DBus.Properties",
   "PropertiesChanged"
)
self.signal.setArguments(
    [interface, property: values, ['']]
)

问题是给 setArguments 的列表中的第三项。它是 列表中的空字符串,因为我需要生成一种类型的 'array of string' (as) 但 pyqt5 将其转换为 'array of variant' (av)。

我从不需要在该列表中放入任何实际数据,我只需要类型 签名正确。

在 PyQt5 中有什么方法可以做到这一点吗?也许使用 QDBusArgument?

【问题讨论】:

您是否尝试过使用bytes(或QByteArray)对象?我发现 this question 从未被设置为已接受,但它可能 一个错误并且在此期间已解决。抱歉,我现在无法制作测试程序,但如果您可以通过编辑您的问题提供minimal, reproducible example,我们会尝试更好地挖掘它。 嗨@musicamante。感谢您的回复。传递QByteArray 最终得到y 的类型签名,根据alteeve.com/w/List_of_DBus_data_types#BYTE 是字节。我找到了一个单独的解决方案,请参阅我添加的答案。 【参考方案1】:

我...我让它工作了。哇。那是一场运动。

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

【讨论】:

见***.com/questions/44830032/where-to-report-pyqt5-bug eyllanesc,谢谢,但正如我所说,我之前尝试过向 pyqt 邮件列表发帖,但我的邮件没有通过。

以上是关于PyQt5 dbus:强制信号参数的类型签名为字符串数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PyQt5 中将字符串数组传递给 dbus? [复制]

有没有办法让标签的字体大小动态调整到 PyQt5 中标签中的文本?

PyQt5-Qt DesignerpyqtSignal()-高级自定义信号与槽

PyQt5 在 dbus 请求失败时创建错误

如何接收使用 dbus 作为信号发送的结构?

使用 Rust DBUS 库时,不满足 trait bound `dbus::arg::Get`