
您的程序有几个问题。我建议您查看来自最新PyQt来源的
remotecontrolledcar和
pingpong示例,它们非常有用。要注意的要点是:
- 您应将一个
MyServer
实例(不是ServerAdaptor
)传递给registerObject()
- 将
pyqtSlot()
装饰器添加到您希望通过D-Bus公开的功能中 - 呼叫
Q_CLASSINFO()
在适配器类的顶部,而不是在其__init__()
功能 - 还要使用以下命令设置“ D-Bus接口”
Q_CLASSINFO()
- 您的自省XML包含一个错字(“目录”而不是“方向”)
这是一个适用于我的简化示例(Python 3.2.3 / Qt 4.8.2 / PyQt 4.9.4):
from PyQt4 import QtDBusfrom PyQt4.QtCore import (QCoreApplication, QObject, Q_CLASSINFO, pyqtSlot, pyqtProperty)from PyQt4.QtDBus import QDBusConnection, QDBusAbstractAdaptorclass MyServer(QObject): def __init__(self): QObject.__init__(self) self.__dbusAdaptor = ServerAdaptor(self) self.__name = 'myname' def echo(self, value): return'Received: {0}'.format(value) @property def name(self): return self.__name @name.setter def name(self, value): self.__name = valueclass ServerAdaptor(QDBusAbstractAdaptor): """ This provides the DBus adaptor to the outside world""" Q_CLASSINFO("D-Bus Interface", "com.home.dbus") Q_CLASSINFO("D-Bus Introspection", ' <interface name="com.home.dbus">n' ' <property name="name" type="s" access="readwrite"/>n' ' <method name="echo">n' ' <arg direction="in" type="s" name="phrase"/>n' ' <arg direction="out" type="s" name="echoed"/>n' ' </method>n' ' </interface>n') def __init__(self, parent): super().__init__(parent) @pyqtSlot(str, result=str) def echo(self, phrase): return self.parent().echo(phrase) @pyqtProperty(str) def name(self): return self.parent().name @name.setter def name(self, value): self.parent().name = valuedef start(): app = QCoreApplication([]) bus = QDBusConnection.sessionBus() server = MyServer() bus.registerObject('/mydbus', server) bus.registerService('com.home.dbus') app.exec()if __name__ == '__main__': start()欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)