[PyKDE] Re: QObject code breakage
ian reinhart geiser
geiseri at yahoo.com
Thu Apr 18 13:03:51 BST 2002
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
On Thursday 18 April 2002 05:53 am, Phil Thompson wrote:
> ian reinhart geiser wrote:
> > -----BEGIN PGP SIGNED MESSAGE-----
> > Hash: SHA1
> >
> > Okay I narrowed this down finally. It looks like the
> > sipConvertToSubClassCode that is there crushes any objects created from a
> > C++ based factory. Since it only knows about PyQt objects any derived
> > ones fail.
> >
> > The issue is that when you pass a pointer from C++ to an embedded Python
> > object it is cast to a QObject if the object has the misfortune of being
> > derived from a QObject. The only other fix is to use MI to confuse SIP
> > enough to leave it alone. It looks like with that code in place all
> > objects created by a factory class get clobbered. I think we should
> > revert the fix, because the old way at least worked. I commented out the
> > sipConvertToSubClassCode sections and now it behaves like it should.
> >
> > Phil what are the chances this could get into 3.2 yet?
>
> Hang on. The old way was changed for you because it didn't do what you
> wanted. The new way requires you to define %ConvertToSubClassCode for
> your new classes in your module. Your code will be called before the
> corresponding QObject code so that it can recognize your classes.
I was afraid of that, I was looking through the cvs commit logs and my old
emails with you and Catalin. It seems that it only effects QObjects so it
never was a problem with korelibs. It seems to mangle all of the classes
based off of QObjects back to QObjects. If you look at the SIP generated code
the arg types are all QObjects and not the correct types. Catalin and I
found this out last night, when we where testing some other embedding tests.
I think I see what you are trying to do though, the problem that you are
having was present in early versions of DCOP. I have to look more at the
function, but I think a big problem is the current map has no idea about
inheritance. IE if I pass in a pointer from my QMainWindow based main window
it will not cast to a QWidget, instead it converts to a QObject. Since this
is correct in the eyes of C++ it compiles, but python screams bloody murder
because it cannot do widget operations on a QObject. (I put "print parent" in
the first line of every arg that had data passed in so I know they all
converted to QObjects).
>
> As PyQt doesn't use this feature itself, it will not be fully tested -
> that's up to you. Bland statements that something doesn't work and
> therefore should be reverted are not helpful. A proper bug report would
> be.
Okay, well I tested it, and basicly it does as I said above, it converts all
QObject based pointers back to QObjects so the types are all wrong in Python.
I would remove the QObject conversion code for now, but drop the
sipConvertToSubClassCode. I think I have an idea of how to make it flow more
with hiarchy but it will require manual modification to every class that sip
touches. Ideally sip should generate some sort of function table that is
aware of the inheritance flow. I have to research this more though. For now
the only place that needed this code is korelibs, and that is not based off
of QObjects, so it dosent benefit from this anyway.
I am trying to put together a korelibs example for PyQt so this can be tested
for releases. I understand how irritating it is to have to deal with us
because we are doing such strange things that really push siplib and pyqt to
the limits of what they can do. I have to commend you for fixing the build
system bug and threading bugs though. We now have Korelibs loading python
based modules as native plugins. Basicly what this means is people can now
embed python extentions into C++ without using sip on every module, only
their base class. Also there is an untested ability to load C++ modules
directly into python without any sip bindings what so ever. This is all
exciting stuff.
Thanks
- -ian reinhart geiser
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.6 (GNU/Linux)
Comment: For info see http://www.gnupg.org
iD8DBQE8vqgYPy62TRm8dvgRAizzAJ9IP3Y0Zz0nyml/NGYotpOnmvVSEQCaAwFi
7AjoszENu5XRRobE6YLxGGo=
=qi+U
-----END PGP SIGNATURE-----
_________________________________________________________
Do You Yahoo!?
Get your free @yahoo.com address at http://mail.yahoo.com
More information about the PyQt
mailing list