[PyQt] Re: ConvertToSubClass problem

Phil Thompson phil at riverbankcomputing.com
Tue Nov 18 13:22:36 GMT 2008


On Tue, 18 Nov 2008 14:06:10 +0100, Giovanni Bajo <rasky at develer.com>
wrote:
> On Tue, 2008-11-18 at 09:27 +0000, Phil Thompson wrote:
>> On Tue, 18 Nov 2008 01:12:49 +0100, Giovanni Bajo <rasky at develer.com>
>> wrote:
>> > Hi Phil,
>> > 
>> > this patch:
>> > 
>> > 2007/02/25  0:19:29  phil
>> > Included Matt Newell's fix for making sure that a sub-class convertor
>> > returns the most specific type available.
>> > 
>> > causes problem with PyQt3Support. Specifically, the
>> > ConvertToSubClassCode in q3mainwindow.sip does not seem to work as
>> > expected. The bug manifests itself when the code is invoked to find
the
>> > most derived class for a Q3ListView. The convertor correctly detects
>> > the
>> > correct type, but this additional check (added by Matt Newell):
>> > 
>> > && !PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)subtype)
>> > 
>> > make it so that the convertor's result is ignored.
>> > 
>> > It might well be that the bug is in the placement of the convertor
>> > within pyqt3support. It is currently placed within Q3MainWindow, but
it
>> > contains conversion code for many different classes (unrelated to
>> > Q3MainWindow). I'm afraid I'm not sure where one should place the
>> > convertors code.
>> > 
>> > Any guess on what exactly is the bug?
>> 
>> As the documentation says, the conversion code must be placed in one of
>> the
>> classes that the code is handling. If the code handled unrelated
classes,
>> how would SIP know when to invoke it?
> 
> The problem is that I don't understand the sentence "one of the classes
the
> code is handling".
> 
> We have this graph within q3mainwindow.sip:
> 
>     static struct class_graph {
>             char *name;
>             sipWrapperType **type;
>             int yes, no;
>         } graph[] = {
>             {sipName_Q3Header,             &sipClass_Q3Header,           
 
>              -1,  1}, //  0
>             {sipName_Q3Accel,              &sipClass_Q3Accel,            
 
>              -1,  2}, //  1
>             {sipName_Q3Action,             &sipClass_Q3Action,           
 
>               3,  4}, //  2
>                 {sipName_Q3ActionGroup,        &sipClass_Q3ActionGroup,  
 
>                  -1, -1}, //  3
>             {sipName_Q3DockArea,           &sipClass_Q3DockArea,         
 
>              -1,  5}, //  4
>             {sipName_Q3Frame,                  &sipClass_Q3Frame,        
 
>               6, 15}, //  5
>                 {sipName_Q3DockWindow,            
&sipClass_Q3DockWindow, 
>                   7,  8}, //  6
>                     {sipName_Q3ToolBar,               
&sipClass_Q3ToolBar,
>                      -1, -1}, //  7
>                 {sipName_Q3Grid,           &sipClass_Q3Grid,             
 
>                  -1,  9}, //  8
>                 {sipName_Q3HBox,           &sipClass_Q3HBox,             
 
>                  10, 11}, //  9
>                     {sipName_Q3VBox,           &sipClass_Q3VBox,         
 
>                      -1, -1}, // 10
>                 {sipName_Q3ScrollView,     &sipClass_Q3ScrollView,       
 
>                  12, -1}, // 11
>                     {sipName_Q3ListView,       &sipClass_Q3ListView,     
 
>                      -1, 13}, // 12
>                     {sipName_Q3Table,          &sipClass_Q3Table,        
 
>                      -1, 14}, // 13
>                     {sipName_Q3ListBox,        &sipClass_Q3ListBox,      
 
>                      -1, -1}, // 14
>             {sipName_Q3MainWindow,         &sipClass_Q3MainWindow,       
 
>              -1, 16}, // 15
>             {sipName_Q3PopupMenu,          &sipClass_Q3PopupMenu,        
 
>              -1, 17}, // 16
>             {sipName_Q3StyleSheet,         &sipClass_Q3StyleSheet,       
 
>              -1, -1}, // 17
>         };
> 
> 
> 
> As you can see, the convertor is placed within "one of the class it's
> handling" (literally: Q3MainWindow). Moreover, they all derive from
> QObject (and QWidget).
> 
> So I don't really understand if the code is correct or not; and if not,
> what we should put where (= how we should split it).

The above is fine, so long as they all have a common super class somewhere
in their class hiearchy.

You said "many different classes (unrelated to Q3MainWindow)" which made it
sound like you were talking about classes that didn't have any super
classes in common.

Did you build the above data structure by hand? Or have I given you a copy
of my script that automatically generates it?

Phil




More information about the PyQt mailing list