[PyKDE] SIP automatically casting up to a QWidget

Matt Newell newellm at blur.com
Thu Feb 22 16:33:47 GMT 2007


On Thursday 22 February 2007 06:32, Phil Thompson wrote:
> On Thursday 22 February 2007 1:53 pm, Paul Giannaros wrote:
> > I have a class A that i'm wrapping with SIP. The class inherits from a
> > bunch of other classes. One of the classes it inherits from also in turn
> > inherits from QWidget. When I import the created module, whenever I call
> > a method that is meant to return an instance of class A I get a QWidget
> > instead. I can use sip.cast to get the QWidget back to an A instance, but
> > that's not a very friendly solution.
> > Can someone suggest why this is happening, or how to fix it?
>
> You need to implement %ConvertToSubClassCode that handles A (and any other
> QObject derived classes in your module).
>

While I understand the use of %ConvertToSubClassCode, it seems to me that it 
should not be required for this case.  If the class hierarchy is

QWidget -> A

and the function signature already shows that the function returns class A, 
why should convertSubClass ever convert it to a QWidget?

I changed my sip a while ago for this case, since I have many Dialogs and 
widgets wrapped with sip that I don't really need automatic converters for, 
but don't want them downgraded to a QWidget when they are constructed.

Here's the code I have inside the while loop in convertToSubClass.  

/*
* The base type is the "root" class that may have a number of
* convertors each handling a "branch" of the derived tree of
* classes.  The "root" normally implements the base function that
* provides the RTTI used by the convertors and is re-implemented
* by derived classes.  We therefore see if the target type is a
* sub-class of the root, ie. see if the convertor might be able to
* convert the target type to something more specific.
*/
if (PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)scc->scc_basetype))
{
	sipWrapperType *subtype;
	subtype = (*scc->scc_convertor)(cppPtr);
	/*
		* Because a base module with convertToSubClass code may know how to convert
		* A -> B -> C
		* a derived module may have a class D that inherits from C, 
		* so the base module may believe it is converting to a more specific type
		* by converting to C, when in fact D is already the most specific type.
		*/
	if (subtype && !PyType_IsSubtype((PyTypeObject*)type, 
(PyTypeObject*)subtype) )
		return subtype;
}


Matt




More information about the PyQt mailing list