[PyQt] How to expose function accepting array of struct to D-Bus?

Evade Flow evadeflow at gmail.com
Mon Aug 6 17:49:21 BST 2012


On Mon, Aug 6, 2012 at 12:29 PM, Phil Thompson
<phil at riverbankcomputing.com> wrote:
> On Mon, 6 Aug 2012 12:15:44 -0400, Evade Flow <evadeflow at gmail.com> wrote:
>> I'm trying to write a PyQt4-based mock object for a C++ app exposed over
>> D-Bus with the following interface:
>>
>>     Q_CLASSINFO("D-Bus Interface", "com.acme.Audio.Control")
>>     Q_CLASSINFO("D-Bus Introspection",
>>     '  <interface name="com.acme.Audio.Control">\n'
>>     '    <method name="echo">\n'
>>     '      <arg direction="in" type="s" name="phrase"/>\n'
>>     '      <arg direction="out" type="s" name="echoed"/>\n'
>>     '    </method>\n'
>>     '    <method name="setParams">\n'
>>     '      <arg direction="out" type="(i)" name="error"/>\n'
>>     '      <arg direction="in" type="a(iiiii)"
>>     name="audioSourceParameter"/>\n'
>>     '      <annotation value="QVector<AudioSourceParameters>"
>> name="com.trolltech.QtDBus.QtTypeName.In0"/>\n'
>>     '      <annotation value="Errors::ErrorCode"
>> name="com.trolltech.QtDBus.QtTypeName.Out0"/>\n'
>>     '    </method>\n'
>>     '  </interface>\n')
>>
>> It's unclear to me how how the setParams() function should be decorated.
>> For the echo() function, I have:
>>
>>     @pyqtSlot(str, result=str)
>>     def echo(self, phrase):
>>         return self.parent().echo(phrase)
>>
>> But what should I put for setParams()? I was tempted to write:
>>
>>     @pyqtSlot('a(iiiii)', result='(i)')
>>     def setParams(self, volume):
>>         return self.parent().echo(phrase)
>>
>> But this results in:
>>
>> TypeError: C++ type 'a(iiiii)' is not supported as a pyqtSlot type
>> argument type
>>
>> So... how does one expose a function to D-Bus that accepts an array of
>> structs, each containing 5 ints?
>
> What would be the C++ signature? Try that as a string.
>
> Phil

The C++ signature is:

  void setParams(QList<AudioSourceParameters> audioSourceParameters,
                 Errors::ErrorCode &error);

where AudioSourceParameters is defined as:

  struct AudioSourceParameters
  {
      int volume;
      int balance;
      int fader;
      int fadein;
      int fadeout;
  };

The C++ code sets things up with:

  Q_DECLARE_METATYPE(QList<AudioSourceParameters>);

and:

   qDBusRegisterMetaType<AudioSourceParameters>();
   qDBusRegisterMetaType<QList<AudioSourceParameters> >();

The introspection XML (presumably output by qdbuscpp2xml) shows this as
'a(iiiii)'. That's what the client app (the one I'm trying to provide a
mock server for) is expecting to see.

Any ideas how to make this work with PyQt?


More information about the PyQt mailing list