PyQt D-BUS 向方法添加多个输出参数

问题描述 投票:0回答:1

我想在 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"
...)?

谢谢!

python c++ qt pyqt5 dbus
1个回答
0
投票

最后,我找到了关于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)
© www.soinside.com 2019 - 2024. All rights reserved.