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

Phil Thompson phil at riverbankcomputing.com
Mon Aug 6 17:29:48 BST 2012


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


More information about the PyQt mailing list