[PyQt] Re: ConvertToSubClass problem

Giovanni Bajo rasky at develer.com
Tue Nov 18 13:06:10 GMT 2008


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).
-- 
Giovanni Bajo
Develer S.r.l.
http://www.develer.com




More information about the PyQt mailing list