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

Posted

技术标签:

【中文标题】PyQt5 在 dbus 请求失败时创建错误【英文标题】:PyQt5 create error upon failed dbus request 【发布时间】:2019-01-04 08:02:51 【问题描述】:

使用 PyQt5 的 D-Bus,如何创建错误?例如,如果有人在聊天程序中发送未知命令,我希望能够让客户端知道如下内容:

error = QDBusMessage.createError(QDBusError.UnknownProperty, "unknown command")
QDBusConnection.systemBus().send(error)

但是,这会失败并显示以下消息:

*** TypeError: arguments did not match any overloaded call:
  createErrorReply(self, str, str): first argument of unbound method must have type 'QDBusMessage'
  createErrorReply(self, QDBusError): first argument of unbound method must have type 'QDBusMessage'
  createErrorReply(self, QDBusError.ErrorType, str): first argument of unbound method must have type 'QDBusMessage'

我不能不理会这个错误,因为据我所知,我完全按照描述使用它。第一个参数必须是 QDBusMessage,因为那是点之前的内容。第二个参数是正确的类型,是<class 'PyQt5.QtDBus.QDBusError.ErrorType'>,由type(QDBusError.UnknownProperty) 返回。引号表示它是一个字符串,这就是str 的含义。

我也尝试过sendErrorReply(),但这似乎在 PyQt5 中不存在。至少,我找不到——它不在systemBussend() 旁边,在QDBusMessage 中也找不到。

PyQt5 的 examples/dbus/chat 文件夹中的示例都不会发出错误。 http://pyqt.sourceforge.net/Docs/PyQt5/QtDBus.html 没有可用的 Python 文档。

【问题讨论】:

输出中显示的self 参数为您提供了一个重要线索,然后通过以下方式明确说明:“未绑定方法的第一个参数必须具有类型'QDBusMessage'”。所以你需要在QDBusMessageinstance 上调用createErrorReply。或者换一种说法:createErrorReply 不是类/静态方法。 这确实构成了一个错误,但我仍然无法发送错误。在调用 QDBusConnection.systemBus().send(error) 时,我收到消息“进程 25541:dbus_message_get_sender() 的参数不正确,文件 ../../dbus/dbus-message.c 第 3437 行中的断言“消息!= NULL”失败。” 【参考方案1】:

当我遇到与您相同的问题时,我遇到了您的问题,PyQt5 中缺少 sendErrorReply

这是我如何让它在我的蓝牙应用程序中工作的:

@pyqtSlot(QDBusMessage)
    def AuthorizeService(self, message):
        print("rejecting service authorization")
        error = message.createErrorReply(QDBusError.AccessDenied, "Failed")
        self._bus.send(error)

诀窍是根据收到的消息创建错误回复。

【讨论】:

以上是关于PyQt5 在 dbus 请求失败时创建错误的主要内容,如果未能解决你的问题,请参考以下文章

在python中动态创建DBus信号

PyQt 5.6:连接到 DBus 信号挂起

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

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

由于 QDBusRawType,dbus-send 失败

在 Windows 7 中使用 cx_freeze 创建的可执行文件在其他计算机上运行时崩溃并出现有关 PyQt5 的错误