[PyKDE] QSqlEditorFactory.createEditor invocation problem, possibly PyQt bug

Phil Thompson phil at river-bank.demon.co.uk
Wed Jun 19 19:11:00 BST 2002


Hans-Peter Jansen wrote:

> Hi Phil et al.,
> 
> after mangling my code for some hours, I'm suspect a PyQt problem
> in QSqlEditorFactory.
> 
> This is the code in qt3/examples/sql/overview/table3/main.h:
> 
> class CustomSqlEditorFactory : public QSqlEditorFactory
> {
>     Q_OBJECT
>     public:
> 	QWidget *createEditor( QWidget *parent, const QSqlField *field );
> };
> 
> and in main.cpp:
> 
> QWidget *CustomSqlEditorFactory::createEditor(
>     QWidget *parent, const QSqlField *field )
> {
>     if ( field->name() == "statusid" ) {
> 	QWidget *editor = new StatusPicker( parent );
> 	return editor;
>     }
> 
>     return QSqlEditorFactory::createEditor( parent, field );
> }
> 
> My corresponding python version:
> 
> class CustomSqlEditorFactory(QSqlEditorFactory):
>     def __init__(self):
>         print "CustomSqlEditorFactory.__init__"
>         QSqlEditorFactory.__init__(self)
> 
>     def createEditor(self, parent, field):
>         print "createEditor:", parent, field
>         if str(field.name()) == "statusid":
>             return StatusPicker(parent)
>         else:
>             return QSqlEditorFactory.createEditor(parent, field)
> 
> The constuctor gets called, but createEditor doesn't. The PyQt docs
> state, this class is fully implemented, but Boudewijn gave me the
> hint, that it has two methods with the same name and the same number
> of arguments. Could it be the problem here?


createEditor() gets called if I right click and select "Insert". You

then hit other problems - the following fixes the immediate ones:


     def createEditor(self, parent, field):
         print "createEditor:", parent, field
         try:
             if str(field.name()) == "statusid":
                 return StatusPicker(parent)
         except AttributeError:
             pass

         return QSqlEditorFactory.createEditor(self, parent, field)

You have to be careful because the Python createEditor() re-implements

all C++ methods of the same name that are in scope. There are two in 
this case so the code needs to determine which it is supposed to do. In 
the above I assume it's the one I'm interested in, and handle the 
exception if it turns out not to be the right one.

You then hit the bugs in StatusPicker, but they seem to be fairly obvious.

Phil





More information about the PyQt mailing list