【问题标题】:D-Bus python PyQt5 service exampleD-Bus python PyQt5 服务示例
【发布时间】:2020-06-04 12:28:30
【问题描述】:

我正在尝试建立一个 PyQt5 D-Bus 服务示例。

这是我目前的代码

#!/usr/bin/python3
from PyQt5.QtCore import QCoreApplication, Q_CLASSINFO, pyqtSlot, QObject
from PyQt5.QtDBus import QDBusConnection, QDBusAbstractAdaptor

import signal
signal.signal(signal.SIGINT, signal.SIG_DFL)

class Service(QDBusAbstractAdaptor):
    Q_CLASSINFO('D-Bus Interface', 'org.example.chat')
    Q_CLASSINFO('D-Bus Introspection', ''
                '  <interface name="org.example.chat">\n'
                '    <method name="GetLastInput">\n'
                '      <arg direction="out" type="s" name="text"/>\n'
                '    </method>\n'
                '  </interface>\n'
                '')

    def __init__(self, parent):
        super().__init__(parent)
        QDBusConnection.sessionBus().registerObject("/", self)

        if not QDBusConnection.sessionBus().registerService("org.example.chat"):
            print(QDBusConnection.sessionBus().lastError().message())

    @pyqtSlot()
    def GetLastInput(self):
        return 'hello'


if __name__ == '__main__':
    app = QCoreApplication([])

    if not QDBusConnection.sessionBus().isConnected():
        print ("Cannot connect to the D-Bus session bus.\n"
               "Please check your system settings and try again.\n");

    service = Service(app)
    print ('Now we are running')
    app.exec_()

这运行没有错误,但“org.example.chat”界面未导出

~$ dbus-send --session --dest="org.example.chat" --type="method_call" --print-reply "/" "org.example.chat.GetLastInput"

Error org.freedesktop.DBus.Error.UnknownInterface: No such interface 'org.example.chat' at object path '/'

用d-feet浏览/对象,我只看到这些接口:

  • org.freedesktop.DBus.Introspectable
  • org.freedesktop.DBus.Peer
  • org.freedesktop.DBus.Properties

我错过了什么?

谢谢

【问题讨论】:

    标签: python service pyqt5 dbus


    【解决方案1】:

    要注册的对象不能是适配器本身,而是另一个QObject。

    作为documentation explains

    [...] 这是通过将一个或多个派生自 QDBusAbstractAdaptor 的类附加到一个普通的 QObject,然后使用 registerObject() 注册 那个 QObject 来实现的。

    registerObject 参数更改为父级,它将起作用:

        def __init__(self, parent):
            super().__init__(parent)
            QDBusConnection.sessionBus().registerObject("/", parent)
    

    您还需要在槽中添加result参数,否则将不起作用:

        @pyqtSlot(result=str)
        def GetLastInput(self):
            return 'hello'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-10
      • 1970-01-01
      • 2019-02-17
      • 2018-04-29
      • 2016-03-06
      • 2019-01-19
      • 2018-01-13
      • 1970-01-01
      相关资源
      最近更新 更多