我尝试使用Python 3.5将插槽连接到PyQt 5.6中通过DBus发出的信号。
当我像QDBUS_DEBUG=1 python3 qtdbustest.py
这样运行我的脚本时,它永远不会接到print('Connected')
的来电,而只是挂在bus.connect(...)
来电。在调试输出中可以看到总线上的信号:
QDBusConnectionPrivate(0x7f3e60002b00):已成功连接 QDBusConnectionPrivate(0x7f3e60002b00)收到消息(信号): QDBusMessage(type = Signal,service =" org.freedesktop.DBus", path =" / org / freedesktop / DBus",interface =" org.freedesktop.DBus", member =" NameAcquired",signature =" s",contents =(":1.137")) QDBusConnectionPrivate(0x7f3e60002b00)交付暂停
这是我最小的工作示例:
#!/usr/bin/python3
import sys
from PyQt5.QtCore import QObject, pyqtSlot
from PyQt5.QtWidgets import QApplication
from PyQt5.QtDBus import QDBusConnection, QDBusMessage
class DbusTest(QObject):
def __init__(self):
super(DbusTest, self).__init__()
bus = QDBusConnection.systemBus()
bus.connect(
'org.freedesktop.DBus',
'/org/freedesktop/DBus',
'org.freedesktop.DBus',
'NameAcquired',
self.testMessage
)
print('Connected')
@pyqtSlot(QDBusMessage)
def testMessage(self, msg):
print(msg)
if __name__ == '__main__':
app = QApplication(sys.argv)
discoverer = DbusTest()
sys.exit(app.exec_())
我做错了什么?必须有一些我忽略的东西,以便对bus.connect(...)
的调用实际返回。
答案 0 :(得分:2)
我能够像这样修复你的例子:
bus = QDBusConnection.systemBus()
bus.registerObject('/', self)
bus.connect( ...
但是,我必须承认我并不完全理解为什么它有效(也就是说,我找不到任何确凿的文件)。但是,在尝试建立连接之前,您需要注册接收器对象似乎是有意义的。