class DBusAdaptor(QDBusAbstractAdaptor): Q_CLASSINFO("D-Bus Interface", "com.troshchinskiy.Heimdall") Q_CLASSINFO( "D-Bus Introspection", '<interface name="com.troshchinskiy.Heimdall">\n' ' <property name="Version" type="s" access="read"/>\n' ' <method name="Connect"/>\n' ' <method name="Disconnect"/>\n' ' <method name="Reset"/>\n' ' <method name="ContextualAction">\n' ' <arg direction="in" type="a{ss}" name="environment"/>\n' ' <arg direction="in" type="s" name="path"/>\n' ' <arg direction="in" type="s" name="command"/>\n' ' </method>\n' ' <method name="echo">\n' ' <arg direction="in" type="s" name="text"/>\n' ' <arg direction="out" type="s" name="return"/>\n' ' </method>\n' '</interface>\n') def __init__(self, parent): super().__init__(parent) @pyqtSlot(str, result=str, name="echo") def echo(self, text): print("Echo called!") return self.parent().echo(text) @pyqtProperty(str) def Version(self): print("Version called!") return self.parent().version() @pyqtSlot(name="Connect") def Connect(self): print("Connect called!") self.parent().start_tunnel() @pyqtSlot(name="Disconnect") def Disconnect(self): print("Disconnect called!") self.parent().stop_tunnel() @pyqtSlot('QVariantMap', str, str) def ContextualAction(self, environment, path, command): print("ContextualAction called!") self.parent().contextual_action(environment, path, command) @pyqtSlot(name="Reset") def Reset(self): print("Reset called!") self.parent().stop_tunnel() self.parent().start_tunnel()
class Ros(QQuickItem, QQmlParserStatus): Q_CLASSINFO('DefaultProperty', 'objects') def __init__(self, parent=None): super(Ros, self).__init__(parent) self._publishers = [] self._subscribers = [] @pyqtProperty(QQmlListProperty) def objects(self): return QQmlListProperty(QQuickItem, self, append=self.append_object) @pyqtProperty(bool) def isInitialized(self): return rospy.core.is_initialized() def append_object(self, node, object): if isinstance(object, Subscriber): self._subscribers.append(object) elif isinstance(object, Publisher): self._publishers.append(object) def componentComplete(self): for s in self._subscribers: s.subscribe() rospy.logdebug('Subscribed to: ' + s.topic.name) for p in self._publishers: rospy.logdebug('Will publish to: ' + p.topic.name) if not rospy.core.is_initialized(): rospy.init_node("ros_qml", disable_signals=True) @pyqtSlot(name='now', result='QVariantMap') def now(self): now = rospy.Time.now() return {'secs': now.secs, 'nsecs': now.nsecs} @pyqtSlot(str, name='logdebug') def logdebug(self, s): rospy.logdebug(s) @pyqtSlot(str, name='loginfo') def loginfo(self, s): rospy.loginfo(s) @pyqtSlot(str, name='logwarn') def logwarn(self, s): rospy.logwarn(s) @pyqtSlot(str, name='logerr') def logerr(self, s): rospy.logerr(s) @pyqtSlot(str, name='logfatal') def logfatal(self, s): rospy.logfatal(s)