[PyKDE] Problem with PyQt3

Phil Thompson phil at riverbankcomputing.co.uk
Thu Dec 28 10:41:55 GMT 2006


On Thursday 28 December 2006 9:14 am, Detlev Offenbach wrote:
> On Wednesday 27 December 2006 23:37, Phil Thompson wrote:
> > On Wednesday 27 December 2006 5:02 pm, Detlev Offenbach wrote:
> > > On Wednesday 27 December 2006 17:58, Phil Thompson wrote:
> > > > On Wednesday 27 December 2006 4:06 pm, Detlev Offenbach wrote:
> > > > > Hi,
> > > > >
> > > > > I have an application with a dialog that was created with Qt
> > > > > Designer and converted to Python with pyuic3. This dialog has an ok
> > > > > and a cancel button. These buttons are connected to the accept()
> > > > > and reject() slots. When I press one of the buttons, I get the
> > > > > following error:
> > > > >
> > > > > RuntimeError: no access to protected functions or signals for
> > > > > objects not created from Python
> > > > >
> > > > > What am I doing wrong?
> > > > >
> > > > > Versions:
> > > > > Qt   3.3.7
> > > > > PyQt 3.17
> > > > > sip  snapshot-20061220
> > > > >
> > > > > all on a x86_64 machine with openSUSE 10.2. All PyQt related stuff
> > > > > is self compiled.
> > > >
> > > > Have you got the .ui file? Is the problem reproducable with just the
> > > > generated .py file and the -x flag?
> > >
> > > I have the .ui file available but unfortunately it is not reproducable
> > > with just the generated .py file. The dialog itself is generated from
> > > some Python code. It looks as if the dialog doesn't really know it is a
> > > Python dialog.
> >
> > So how was the instance the exception was raised against created and what
> > method were you calling?
>
> Problem found thanks to your questions. It was caused by a parent object
> given to the dialog, which was not created from Python code. The protected
> methods (slots) called by the dialog were accept() and reject(). How a non
> Python created parent influences this is unclear to me. Maybe this should
> be mentioned in the PyQt docs.

A parent doesn't influence it - you just can't call protected methods of an 
object not created by Python (and Qt implements emit by calling a protected 
method).

When SIP (ie. Python) creates a new C++ object it creates a SIP generated 
sub-class of the required type. This sub-class includes public wrappers 
around the super-class's protected methods in order to expose them. If Python 
doesn't create the C++ object then the public wrappers aren't available.

Phil




More information about the PyQt mailing list