[PySide] Typedef template containers

John Cummings jcummings2 at users.sf.net
Thu May 31 21:30:21 CEST 2012


I am sending this message to the list in case it can save anyone else hours of 
frustration. If someone knows a better way to handle typedef'd template 
containers as arguments, please let me know.

If you have a typedef template container (Qt-based, STL-based or your own custom 
one) and functions (or methods) such as:

    QVector<double> FooType;
    FooType returnFoo();
    void callWithFoo(FooType foo);

Your typesystem XML file will need to have the following lines:

    <function signature="returnFoo()" />
    <function signature="callWithFoo(QVector<double>)" />

Note the difference between returning a typedef'd container and passing one as 
an argument. Namely, Shiboken is fine with returning the typedef directly since 
you don't have to specify it in the typesystem XML file. However, if you are 
passing a typedef'd container into a function (or method), you must specify the 
underlying type (and convert '<' to "lt;" and '>' to "gt;"). If you try to use 
"FooType" instead of specifying the underlying type, you will get a warning 
message from Shiboken along the lines of:  "Global function 'callWithFoo(FooType 
foo)' is specified in typesystem, but not defined. This could potentially lead 
to compilation errors." It might compile but callWithFoo will not be accessible 
from python. Adding various "object-type" or "value-type" tags won't help either.

You will also need a "container-type" conversion tag. If you are using QVector, 
then you can just point at the existing conversion logic by adding the following 
to your typesystem XML file:

    <load-typesystem name="typesystem_core.xml" generate="no" />
    <load-typesystem name="typesystem_templates.xml" generate="no"/>

You can also look at those two files as an example for handling other container 
types.

As I said, I hope this saves someone else some time. It would be a nice feature 
if Shiboken could understand the typedefs for you instead of you having to 
manually make the substitution.

John Cummings
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/pyside/attachments/20120531/f36e410e/attachment.html>


More information about the PySide mailing list