我想在 PyQt5 D-BUS 方法中添加几个输出参数。我从qt example克隆了这个例子。在类
CarInterfaceAdaptor
中,我添加了一个新方法 control
,它具有三个输出参数:speed
、shift
和 value
:
class CarInterfaceAdaptor(QDBusAbstractAdaptor):
Q_CLASSINFO("D-Bus Interface", 'org.example.Examples.CarInterface')
Q_CLASSINFO("D-Bus Introspection", ''
' <interface name="org.example.Examples.CarInterface">\n'
' <method name="accelerate"/>\n'
' <method name="decelerate"/>\n'
' <method name="turnLeft"/>\n'
' <method name="turnRight"/>\n'
' <method name="control">\n'
' <arg name="name" type="s" direction="in"/>\n'
' <arg name="delta" type="i" direction="in"/>\n'
' <arg name="speed" type="d" direction="out"/>\n'
' <arg name="shift" type="i" direction="out"/>\n'
' <arg name="value" type="s" direction="out"/>\n'
' </method>\n'
' </interface>\n'
'')
如果我使用
qdbusxml2cpp
来编译上面的xml。我可以获得control
的声明:
double control(const QString &name, int delta, int &shift, QString &value);
此函数返回第一个输出参数 (
speed
),其他输出参数定义为输出引用参数(shift
和 value
)。
我编写并运行了一个 PyQt
QDBusAbstractInterface
派生类,它具有以下功能:
def control(self):
message = self.call('control', "car", 2)
print(message.arguments())
for arg in message.arguments():
print(arg)
我得到了以下输出:
[100.0, 200, 'OK']
100.0
200
OK
在 Python 中,函数没有等效的输出引用参数。 但是,我可以在列表中返回所有这些输出参数,如下所示:
@pyqtSlot(str, int, result=list)
def control(self, name, delta):
print("name: {}, delta: {}".format(name, delta))
speed = 100
shift = 200
value = "OK"
return [speed, shift, value]
现在我得到以下输出。
[[100, 200, 'OK']]
[100, 200, 'OK']
它返回一个列表,而不是三个输出参数!看来是错误的。所以
Q1:那么我如何在
PyQt D-BUS中定义
control
,它可以返回多个参数(如 C++)但不是列表?
Q2:在PyQt5 D-BUS中,我发现即使我没有在
control
中添加Q_CLASSINFO
的声明,它仍然有效。那么 Q_CLASSINFO("D-Bus Introspection"
...) 是做什么用的?而且,我是否应该定义 Q_CLASSINFO("D-Bus Introspection"
...)?
谢谢!
最后,我找到了关于Q1的解决方案:使用
QDBusMessage
!。
@pyqtSlot(str, int, QDBusMessage)
def control(self, name, delta, message):
print("name: {}, delta: {}".format(name, delta))
reply = message.createReply([100, 200, "OK"])
QDBusConnection.sessionBus().send(reply)