[PySide] Bug is worse - please ignore
tismer at stackless.com
Fri Nov 30 09:57:53 CET 2012
I tried my example again today and have to admit that I can't
reproduce the problem, myself.
I had too many windows open last night and was misled.
properties are ok, they don't create a reference (sigh, good)
and I was messing up, because of my reduced vision.
Sorry about this.
cheers - chris
On 30.11.12 03:43, Nathan Smith wrote:
> I am very interested in this because I have a PySide application where
> my widgets don't die gracefully (and destroyed isn't signalling their
> death). I use properties heavily in my code, so I was excited when I
> saw your email thinking they were the culprit. However, I just tried
> your example using Python 2.7.1 and PySide 1.1.1, and I can't
> reproduce the problem. My table prints "destroyed" immediately when I
> call del m. Are you sure that "property" creates a reference?
> I did verify in my environment that onDestroy must be static to
> function correctly.
> On Thu, Nov 29, 2012 at 4:40 PM, Christian Tismer
> <tismer at stackless.com <mailto:tismer at stackless.com>> wrote:
> Hi friends,
> On 11/29/12 6:37 PM, Stephan Deibel wrote:
> > Alexey Vihorev wrote:
> >> Thanks, nice find, but... I hit the next hurdle trying to go this
> >> way. The signal QObject.destroyed(obj) is passing no arguments
> >> (probably because obj is already destroyed), so my static
> method has
> >> nothing to work on. Which kind of devaluates the whole idea, IMHO.
> >> And in PyQt4 it*does* pass the object. Even more: in PyQt4 there is
> >> no need for static method approach, as it works perfectly with
> >> instance methods:
> > Yea, you would have to bind the necessary data to the callback
> like this:
> > def on_destroy(val1=self.whatever, val2=self.something):
> > print 'destroyed'
> > self.destroyed.connect(on_destroy)
> > Whether this is possible or useful in your case is of course
> going to
> > depend on the details of the code.
> > Having 'destroyed' be emitted before the object is destroyed and
> > getting the object reference as an arg makes more sense to me.
> That is
> > what PyQt seems to do and it is what QObject does under Qt using
> > so I'd call this a bug in PySide. I've added
> > https://bugreports.qt-project.org/browse/PYSIDE-129
> This bug is only half of the story:
> We had that simple @staticmethod work-around.
> But actually, the main reason seems to be that PySide suffers
> any reference cycle.
> The tiny example again breaks as soon as I add a property:
> from PySide.QtCore import QAbstractTableModel, QObject
> class MyModel(QAbstractTableModel):
> def __init__(self, *args):
> super(MyModel, self).__init__(*args)
> def onDestroy():
> def hugo(self):
> return 42
> m = MyModel()
> del m
> Remove the @property, and it works, again.
> Rule of thumb:
> If you need anything like a property, use a normal Python class
> and put your Qt object into it as an attribute. Otherwise your
> program will tend to grow in memory ;-)
> Stefan, I added this code to your bug report.
> cheers - chris
> Christian Tismer :^) <mailto:tismer at stackless.com
> <mailto:tismer at stackless.com>>
> Software Consulting : Have a break! Take a ride on
> Karl-Liebknecht-Str. 121 : *Starship*
> 14482 Potsdam : PGP key -> http://pgp.uni-mainz.de
> phone +49 173 24 18 776 <tel:%2B49%20173%2024%2018%20776> fax +49
> (30) 700143-0023 <tel:%2B49%20%2830%29%20700143-0023>
> PGP 0x57F3BF04 9064 F4E1 D754 C2FF 1619 305B C09C 5A3B 57F3
> whom do you want to sponsor today? http://www.stackless.com/
> PySide mailing list
> PySide at qt-project.org <mailto:PySide at qt-project.org>
Christian Tismer :^) <mailto:tismer at stackless.com>
Software Consulting : Have a break! Take a ride on Python's
Karl-Liebknecht-Str. 121 : *Starship* http://starship.python.net/
14482 Potsdam : PGP key -> http://pgp.uni-mainz.de
phone +49 173 24 18 776 fax +49 (30) 700143-0023
PGP 0x57F3BF04 9064 F4E1 D754 C2FF 1619 305B C09C 5A3B 57F3 BF04
whom do you want to sponsor today? http://www.stackless.com/
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the PySide