[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