我需要使用从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()
,但我还没有发现任何有效的方法
目前没有回答
相关问题 更多 >
编程相关推荐