如何使用 QDBusAbstractAdaptor 和 PyQt4 在 DBus 上公开方法和属性?

2024-01-09

我正在尝试使用 PyQt4(特别是 QtDBus)在 DBus 上运行一些基本代码。我正在使用 PyQt4 的 Python3 版本。我已经获得了想要在 Qt (c++) 上运行的代码,但我想仅使用 Python 来运行类似的代码。我想在 DBus 上公开方法、信号/槽和属性,以供其他 Python 代码调用。

在 Qt 中,您使用 Q_CLASSINFO 宏/函数来进行 DBus 自省。虽然我已经引入了 Q_CLASSINFO 方法,但我无法让它产生相同类型的功能。据我所知,关于 Q_CLASSINFO 方法的文档为零,所以我不确定是否还有其他方法。使用 D-Feet,我可以清楚地看到没有自动公开任何方法,所以我有点卡住了。

这是我到目前为止所拥有的。

from PyQt4 import QtDBus
from PyQt4.QtCore import QCoreApplication, QObject, Q_CLASSINFO, pyqtSlot, pyqtProperty
from PyQt4.QtDBus import QDBusConnection, QDBusAbstractAdaptor

SERVICE = 'com.home.dbus'

class MyServer(QObject):


    def __init__(self):
        QObject.__init__(self)
        self.__dbusAdaptor = ServerAdaptor(self)

    def close(self):
        pass

    def echo(self, value):
        echoed = 'Received {0}'.format(value)
        return echoed

    def name(self):
        return 'myname'

    def dbus_adaptor(self):
        return self.__dbusAdaptor

class ServerAdaptor(QDBusAbstractAdaptor):
    """ This provides the DBus adaptor to the outside world"""

    def __init__(self, parent):
        super().__init__(parent)
        self.__parent = parent
        Q_CLASSINFO("D-Bus Introspection",
        "  <interface name=\"com.home.dbus\">\n"
        "    <method name=\"name\">\n"
        "      <arg direction=\"out\" type=\"s\" name=\"name\"/>\n"
        "    </method>\n"
        "    <method name=\"echo\">\n"
        "      <arg direction=\"in\" type=\"s\" name=\"phrase\"/>\n"
        "      <arg directory=\"out\" type=\"s\" name=\"echoed\"/>\n"
        "    </method>\n"
        "  </interface>\n")

    def close(self):
        parent.close()

    def echo(self, value):
        return parent.echo(value)

    def name(self):
        return parent.name

def start():
    app = QCoreApplication([])
    if QDBusConnection.sessionBus().isConnected() == False:
        print('Cannot connect to D-Bus session bus')
        return
    print('Starting')
    server = MyServer()
    if not QDBusConnection.sessionBus().registerService(SERVICE):
        print('Unable to register service name')
        return
    if not QDBusConnection.sessionBus().registerObject('/mydbus', server.dbus_adaptor):
        print('Unable to register object at service path')
        return
    app.exec();
    print('Exited')

if __name__ == '__main__':
    start()

虽然我真的很喜欢在 C++ 中使用 QtDBus,因为我想如何构建我的这个大型项目,但我确实需要通过 DBus 访问的对象用 Python3 编写。


您的程序存在几个问题。我建议看看remotecontrolledcar and pingpong来自最新 PyQt 源的示例,它们非常有帮助。主要注意事项是:

  • 你应该通过一个MyServer实例(不是ServerAdaptor) to registerObject()
  • Add pyqtSlot()您希望通过 D-Bus 公开的函数的装饰器
  • Call Q_CLASSINFO()在适配器类的顶部,而不是在其内部__init__()功能
  • 还使用设置“D-Bus Interface”Q_CLASSINFO()
  • 您的内省 XML 包含拼写错误(“目录”而不是“方向”)

这是一个适合我的精简示例(Python 3.2.3/Qt 4.8.2/PyQt 4.9.4):

from PyQt4 import QtDBus
from PyQt4.QtCore import (QCoreApplication, QObject, Q_CLASSINFO, pyqtSlot,
                          pyqtProperty)
from PyQt4.QtDBus import QDBusConnection, QDBusAbstractAdaptor

class 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 = value


class 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 = value

def start():
    app = QCoreApplication([])
    bus = QDBusConnection.sessionBus()
    server = MyServer()
    bus.registerObject('/mydbus', server)
    bus.registerService('com.home.dbus')
    app.exec()

if __name__ == '__main__':
    start()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 QDBusAbstractAdaptor 和 PyQt4 在 DBus 上公开方法和属性? 的相关文章

  • Matplotlib 标准化颜色条 (Python)

    我正在尝试使用 matplotlib 当然还有 numpy 绘制轮廓图 它有效 它绘制了它应该绘制的内容 但不幸的是我无法设置颜色条范围 问题是我有很多图 并且需要所有图都具有相同的颜色条 相同的最小值和最大值 相同的颜色 我复制并粘贴了在
  • 打印 scrapy 请求的“响应”

    我正在尝试学习 scrapy 在遵循教程的同时 我正在尝试进行细微的调整 我想简单地从请求中获取响应内容 然后我会将响应传递到教程代码中 但我无法发出请求并获取响应内容 建议就好 from scrapy http import Respon
  • 为什么我不能导入 geopandas?

    我唯一的代码行是 import geopandas 它给了我错误 OSError Could not find libspatialindex c library file 以前有人遇到过这个吗 我的脚本运行得很好 直到出现此错误 请注意
  • Dask DataFrame 的逐行处理

    我需要处理一个大文件并更改一些值 我想做这样的事情 for index row in dataFrame iterrows foo doSomeStuffWith row lol doOtherStuffWith row dataFrame
  • 在 Python 中使用 sec 函数的反函数

    我正在创建一个程序 用于计算从一定高度范围和设定初始速度发射射弹的最佳角度 在我需要使用的最终方程中 存在一个反 sec 函数 它导致了一些麻烦 我已经导入了数学并尝试使用 asec 无论如何 但是数学似乎无法计算反秒函数 我也明白 sec
  • 无法包含外部 pandas 文档 Pycharm v--2018.1.2

    我无法包含外部 pandas 文档Pycharm v 2018 1 2 例如 numpy gt http docs scipy org doc numpy reference generated module name element na
  • 当x轴不连续时如何删除冗余日期时间 pandas DatetimeIndex

    我想绘制一个 pandas 系列 其索引是无数的 DatatimeIndex 我的代码如下 import matplotlib dates as mdates index pd DatetimeIndex 2000 01 01 00 00
  • 唯一的图像哈希值即使 EXIF 信息更新也不会改变

    我正在寻找一种方法来为 python 和 php 中的图像创建唯一的哈希值 我考虑过对原始文件使用 md5 和 因为它们可以快速生成 但是当我更新 EXIF 信息 有时时区关闭 时 它会更改总和 并且哈希也会更改 有没有其他方法可以为这些文
  • 如何在 Windows 上使用 Python 3.6 来安装 Python 2.7

    我想问一下如何使用pip install对于 Python 2 7 当我之前安装并使用 Python 3 6 时 我现在必须使用 Windows 上的 Python 版本 pip install 继续安装 Python 3 6 我需要使用以
  • Python unicode 字符代码?

    有没有办法将 Unicode 字符 插入 Python 3 中的字符串 例如 gt gt gt import unicode gt gt gt string This is a full block s unicode charcode U
  • ValueError:无法插入 ID,已存在

    我有这个数据 ID TIME 1 2 1 4 1 2 2 3 我想按以下方式对数据进行分组ID并计算每组的平均时间和规模 ID MEAN TIME COUNT 1 2 67 3 2 3 00 1 如果我运行此代码 则会收到错误 ValueE
  • 在谷歌C​​olab中使用cv2.imshow()

    我正在尝试通过输入视频来对视频进行对象检测 cap cv2 VideoCapture video3 mp4 在处理部分之后 我想使用实时对象检测来显示视频 while True ret image np cap read Expand di
  • Python 矩阵每一行的总和

    lista 1 2 3 4 5 6 7 8 9 print lista def filas lista res for elemento in lista x sum lista elemento res append x print re
  • WindowsError:[错误 5] 访问被拒绝

    我一直在尝试终止一个进程 但我的所有选项都给出了 Windows 访问被拒绝错误 我通过以下方式打开进程 一个python脚本 test subprocess Popen sys executable testsc py 我想杀死那个进程
  • 使用 Doc2vec 后如何解释 Clusters 结果?

    我正在使用 doc2vec 将关注者的前 100 条推文转换为矢量表示形式 例如 v1 v100 之后 我使用向量表示来进行 K 均值聚类 model Doc2Vec documents t size 100 alpha 035 windo
  • 如何在单独的文件中使用 FastAPI Depends 作为端点/路由?

    我在单独的文件中定义了一个 Websocket 端点 例如 from starlette endpoints import WebSocketEndpoint from connection service import Connectio
  • 如何对字符串列表进行排序?

    在 Python 中创建按字母顺序排序的列表的最佳方法是什么 基本回答 mylist b C A mylist sort 这会修改您的原始列表 即就地排序 要获取列表的排序副本而不更改原始列表 请使用sorted http docs pyt
  • 具有指定置信区间的 Seaborn 条形图

    我想在 Seaborn 条形图上绘制置信区间 但我已经计算出置信区间 如何让 Seaborn 绘制我的置信区间而不是尝试自行计算它们 例如 假设我有以下 pandas DataFrame x pd DataFrame Group 1 0 5
  • 在 Qt 中构建 Android 项目不再有效

    所以我对 Android SDK NDK 和 Apache Ant 进行了一些更新 现在我无法构建任何 Android 项目 我收到一条警告 然后它说找不到 build xml 文件 错误 Warning Android platform
  • 将此 MATLAB 代码转换为 Python 时我做错了什么?

    我正在努力将生成波形的 MATLAB 代码转换为 Python 就上下文而言 这是原子力显微镜带激发响应的模拟 与代码错误无关 在 MATLAB 中从 r vec 生成的图形与我在 Python 中生成的图形不同 我是否正确地将 MATLA

随机推荐

  • 带有缓存存储的 Angular 5

    我尝试在 Angular 5 中使用 CacheStorage 的承诺 如文档中所示 let test caches open test test then result Cache gt result add test png 但我得到了
  • 帮助匹配两个类之间的字段

    我对 Java 还不太有经验 我希望有人能引导我走向正确的方向 因为现在我感觉我只是在用头撞墙 第一个类称为 MeasuredParams 它有 40 多个数字字段 身高 体重 腰围尺寸 手腕尺寸 一些是整数 但大部分是双精度型 第二类是统
  • 保存前受影响的 Mongoose _id

    var mongoose require mongoose mongoose connect mongodb localhost test var Cat mongoose model Cat name String var kitty n
  • Imagebutton 完整图像,圆角

    嗯 我的 Android 应用程序中有一些 ImageButtons 我希望他们展示完整的图片 我的意思是 我希望 ImageButton 只是图片 你知道吗 好吧 到目前为止 一切顺利 我可以使用 背景 属性来做到这一点 不过我也希望 I
  • 部署 Cloud Functions 后出现错误:无法刷新访问令牌。

    我已经用 Firebase Cloud Functions 进行了一段时间的实验 今天我对我的 index json 文件做了一个小小的更改 在要设置的文档中添加了一个字段 在 Firebase Console gt Functions g
  • 如何保持控件禁用直到线程结束

    我正在通过 GPS 调制解调器使用以下代码通过 comport 发送短信 Thread thread null private void btnsend Click object sender EventArgs e if thread n
  • Android:层次结构查看器不存在

    我在 Mac Sierra 上使用 Android Studio 2 3 打开设备监视器时找不到层次结构查看器 视角列表中没有查看者 有人知道这是为什么吗 无法评论 无代表 更新到最新的构建工具后 层次结构查看器和一堆其他东西已从工具目录中
  • MVC Ajax 更新面板

    我知道 至少我很确定 没有像 asp UpdatePanel 这样的 MVC 控件 谁能给我一些关于如何做到这一点的想法 我有一个集合 我从我的存储库和服务层添加条目 在我的主页中 我想根据此集合中是否有任何内容来显示警报 通常我会有一个
  • 使用 Bash 时哪些字符需要转义?

    Bash 中是否有需要转义的字符的完整列表 是否可以仅通过检查sed 特别是 我正在检查是否 是否需要逃避 我试过 echo h h sed s i g 并且工作得很好 没有逃脱 是不是意味着 不需要逃避吗 这是检查必要性的好方法吗 更一般
  • 在 Emacs + Slime + Clojure + Windows 设置中,无法加载 clojure-auto

    我跟着这个非常有用的指南 http dc clj fogus me index php title Installing Clojure and Slime on Windows设置此开发环境 当运行emacs bat我在 Emacs 中收
  • 我该如何处理<>f__AnonymousType0`2[System.Int32,System.String][]?

    我想访问从方法返回的列表 但我得到了错误 未捕获的类型错误 无法读取未定义的属性 长度 当我调试代码时 我在变量结果中得到了返回值 例如f AnonymousType0 2 System Int32 System String 那么如何处理
  • 如何运行 cURL 一次,循环检查域可用性?请帮助修复代码

    我所做的是域可用性检查 它连接到 API 并从 tmp 输出 可用 和不可用 下面的代码只会检查一次可用性 我想多次检查域的可用性 可能是循环 无需每次都重新启动 cURL 连接 因为这浪费时间 我只是不知道如何连接到 cURL 一次并运行
  • 正则表达式模式数字后跟一个字符

    我正在尝试让正则表达式适合以下场景 但遇到了一些麻烦 下面是场景 我的字符串看起来像这样 The office timing h is from 8h to 18h 从上面的字符串我需要 8h and 18h 到目前为止我已经做到了这一点
  • UIScrollview 与 UIButtons - 如何重新创建跳板?

    我正在尝试在我的应用程序中创建一个类似跳板的界面 我正在尝试使用添加到 UIScrollView 的 UIButtons 我遇到的问题是按钮没有将任何触摸传递给 UIScrollView 如果我尝试轻弹 滑动并碰巧按下按钮 它不会注册 UI
  • Objective-C 中子类是否继承其父类的协议?

    假设我有一个实现协议的父类 interface GameViewController UIViewController
  • 如何在玩笑测试中处理 localStorage?

    我在 Jest 测试中不断收到 localStorage 未定义 的消息 这是有道理的 但我的选择是什么 撞砖墙 很好的解决方案来自 chiedo https stackoverflow com users 2015685 chiedo 不
  • 从 matlab 调用 python

    我正在使用 matlab 2016b 很高兴看到 Matlab 中有一些 python 支持 https uk mathworks com help matlab matlab external call python from matla
  • 什么是 Levity 多态性

    正如问题标题所示 我想知道什么是 Levity 多态性以及它的动机是什么 我知道这一页 https ghc haskell org trac ghc wiki NoSubKinds其中有一些细节 但其中的大部分解释都超出了我的理解范围 Wh
  • Next 13 和 Tailwind 深色模式闪烁

    我希望通过 Next 13 的新 appDir 实现本博客中列出的结果 无闪烁深色主题切换 https conermurphy com blog make flicker free dark theme toggle nextjs tail
  • 如何使用 QDBusAbstractAdaptor 和 PyQt4 在 DBus 上公开方法和属性?

    我正在尝试使用 PyQt4 特别是 QtDBus 在 DBus 上运行一些基本代码 我正在使用 PyQt4 的 Python3 版本 我已经获得了想要在 Qt c 上运行的代码 但我想仅使用 Python 来运行类似的代码 我想在 DBus