如何实现GetManagedObjects,使其返回正确的签名?

2024-06-08 20:45:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要使用从QDBusAbstractAdaptor继承的PyQt5实现一个类。此类需要实现org.freedesktop.DBus.ObjectManager interface,其中包括以下方法:

org.freedesktop.DBus.ObjectManager.GetManagedObjects (out DICT<OBJPATH,DICT<STRING,DICT<STRING,VARIANT>>> objpath_interfaces_and_properties);

输出参数的签名是a{oa{sa{sv}}}

我不知道如何在PyQt5中管理它,因为它似乎受到限制,DBus字典只能有key&;可以由QMetaType指定的值类型。所以,我可以做一些简单的事情,比如:

class AnotherAdapter(QDBusAbstractAdaptor):
    Q_CLASSINFO("D-Bus Interface", "org.freedesktop.DBus.ObjectManager")
    
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setAutoRelaySignals(True)

    @pyqtSlot(QDBusMessage)
    def GetManagedObjects(self, msg_in):
        arg = QDBusArgument()
        arg.beginMap(QMetaType.QString, QMetaType.QString)
        arg.beginMapEntry()
        arg.add('/com/test1')
        arg.add('test test test')
        arg.endMapEntry()
        arg.endMap()

        reply = msg_in.createReply([arg])
        bus = QDBusConnection.systemBus()
        bus.send(reply)

然后返回一个带有签名a{ss}的回复,这是一个字符串键字典&;字符串值。接下来,我需要让它将第一个元素解释为DBusObjectPath,因此它将是a{os}。既然DBusObjectPath没有QMetaType,那怎么做呢?我的理解是PyQt5不支持注册新的元类型

除此之外,我还需要弄清楚如何嵌套字典,以便从a{os}a{oa{sa{sv}}}。我尝试了一些方法,比如仅仅添加另一个级别的beginMap()beginMapEntry(),但我还没有发现任何有效的方法


Tags: 方法orgtestselfstring字典argdict