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 中标签中的文本?