[PyKDE] Help with SIP

Jim Bublitz jbublitz at nwinternet.com
Mon Oct 2 05:13:15 BST 2006


On Sunday 01 October 2006 18:44, Christoph Spoerri wrote:
> Hi there,

> I just signed up to the list here, since I'm trying to create a python
> wrapper for an QT application. As you can imagine I'm running into
> problems since I'm new to SIP and its functions.

> The first question I'm having is how I need to deal with classes that
> depend on each other. Let's assume I have class A which returns
> instances for class B and C. Do I need to create .sip file for B and C
> first (b.sip/c.sip)? Or can I just create the a.sip file?

"Returns instances" to where? If B and C are not visible in the sip file for A 
and not wanted in Python, then you don't need a .sip file for B and C. For 
example:

C++    a.h
===

class A
{
public:
	       A ();
   bool   doSomething (int x);
   B *     createB ();
   C *     createC  ();
};

sip file   a.sip
====
class A
{
%TypeHeaderCode
#include <a.h>
%End

public:
	       A ();
   bool   doSomething (int);
};

On the other hand, if you want to call method "createB" in Python, then B 
needs a .sip file (but only if it returns B; if it's 

void createB ();

sip won't care.) However, C++ will want to see the definitions for B and C 
when it reads the h file - you need to make sure their h files (if they're 
not in a.h) are included during compilation. You can put them in the 
%TypeHeaderCode block if necessary. sip doesn't read h files and nothing in 
the cpp files makes a difference (as far as sip goes).

If you have a situation like:

class A : public B

you either need to do bindings for B, or in the sip file:

class A

and ignore the base class (but then you won't get the base class's methods 
either).

> The second questions is in regard of compiling the classes. In case I
> need all three classes, what's the easiest way to compile them all at
> the same time?

If they're small enough (for your convenience), you can put all of the classes 
in a single sip file. Alternatively, you can create a single "top level" sip 
file and just pass that file to sip:

amod.sip
======

// the name you import in Python "import someName"
// Only one of these per module, so if it's here, don't
// put it in a.sip, b..sip or c.sip
%Module  someName

%Import qt   // if a,b, or c depend on qt in their sip files

%Include a.sip
%Include b.sip
%Include c.sip

The sequence is unimportant - sip collects all symbols in a module and then 
checks that they're all defined, unlike C++, where definitions are sequence 
dependent.

Take a look at how PyQt/sip/qt/qtmod.sip is set up. There are also sip docs in 
the sip tarball (in the doc/ directory). You can get the tarball from 
http://riverbankcomputing.co.uk.

Jim




More information about the PyQt mailing list