Hi Erik,
attacched is a small sample of what I'm doing in my app, I have a dialog
that require some time to open, to speed up the things I store it in a
global object and use this global object to reopen the dialog,
this seems to work, I'm reusing the same dialog from different central
widget, some times (I'm unable to reproduce) I see in the logs:
RuntimeError: underlying C/C++ object has been deleted
so I added a try except when I open the dialog, until today noone
reported segfault, what do you think about this usage?
thanks
Nicola
Il giorno ven, 21/01/2011 alle 08.47 +0100, Erik Janssens ha scritto:
> Hi,
>
> I wrote some general documentation around these
> issues, with regard to Camelot development, but
> it might be of use to others as well :
>
> http://downloads.conceptive.be/downloads/camelot/doc/sphinx/build/advanced/development.html
>
> all remarks/corrections are welcome.
>
> Regards,
>
> Erik
>
> On Thu, 2011-01-20 at 10:22 +0100, Mailing List SVR wrote:
> > Ok, in a my pyqt app (I'm still using pyqt-4.7.x), I have a dialog that
> > require much time to open so I keep a reference to it in a app global
> > variable and I use this reference to reopen the dialog after the first
> > time. This seems to work and the dialog open much quicker, however in
> > some undeterminated cases I get:
> >
> > RuntimeError: underlying C/C++ object has been deleted
> >
> > when I get this error I recreate the dialog and update the global
> > reference,
> >
> > can you please explain the right way to keep a reference in python to a
> > qt object?
> >
> > thanks
> > NIcola
> >
> >
> > Il giorno mer, 19/01/2011 alle 23.47 +0100, Erik Janssens ha scritto:
> > > there was a change in sip/pyqt from 4.8.1 to 4.8.2 regarding
> > > the detection of objects deleted by qt but still referenced in
> > > python (which is the case here). in 4.8.1 sip/pyqt tried to
> > > detect this to avoid segfaults. this detection however brought
> > > other issues with it, therefor the detection was turned off again
> > > in 4.8.2
> > >
> > > the solution is not to keep references in python of objects
> > > owned by qt when they might get deleted.
> > >
> > > On Wed, Jan 19, 2011 at 12:36 PM, Mailing List SVR
> > > <[email protected]> wrote:
> > > > I can confirm the segfault:
> > > >
> > > > - linux, kernel 2.6.36
> > > > - python 2.7.1
> > > > - pyqt 4.8.2
> > > > - qt 4.7.1
> > > >
> > > > works fine with PySide,
> > > >
> > > > Nicola
> > > >
> > > >
> > > > Il giorno mer, 19/01/2011 alle 08.36 +0100, Vicent Mas ha scritto:
> > > >> 2011/1/18 Nick Gaens <[email protected]>:
> > > >> > - Win7 64bit
> > > >> > - Python 2.6.6 (r266:84297, Aug 24 2010, 18:46:32) [MSC v.1500 32 bit
> > > >> > (Intel)] on win32
> > > >> > - Qt v4.7.0
> > > >> > - PyQt GPL v4.8.1 for Python v2.6
> > > >> > Result: no crashes, works like a charm..
> > > >> >
> > > >>
> > > >> Hi,
> > > >>
> > > >> I get the crash also on Windows Vista 32bit (again Python 2.6 and PyQt
> > > >> 4.8.2)
> > > >>
> > > >> Vicent
> > > >>
> > > >
> > > > _______________________________________________
> > > > PyQt mailing list [email protected]
> > > > http://www.riverbankcomputing.com/mailman/listinfo/pyqt
> > > >
> > > _______________________________________________
> > > PyQt mailing list [email protected]
> > > http://www.riverbankcomputing.com/mailman/listinfo/pyqt
> >
>
>
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtGui, QtCore
class AppGlobal(object):
global_dlg=None
app_global=AppGlobal()
class TestDialog(QtGui.QDialog):
def __init__(self,parent=None):
super(TestDialog,self).__init__(parent)
self.setWindowTitle('Reference Dialog')
self.setGeometry(200, 200, 150, 120)
self.test_button = QtGui.QPushButton('Close dialog', self)
self.connect(self.test_button, QtCore.SIGNAL('clicked()'),self.accept)
def onClose(self):
print self.parent()
if app_global.global_dlg is None:
print 'keep a dialoog reference in app_global'
app_global.global_dlg=self
self.setParent(None)
def accept(self):
self.onClose()
QtGui.QDialog.accept(self)
def reject(self):
self.onClose()
QtGui.QDialog.reject(self)
class TestWidget(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setGeometry(300, 300, 250, 150)
self.test_button = QtGui.QPushButton('Open dialog', self)
self.test_button.setGeometry(10, 10, 200, 35)
self.test_button1 = QtGui.QPushButton('Change widget', self)
self.test_button1.setGeometry(10, 60, 200, 35)
self.connect(self.test_button, QtCore.SIGNAL('clicked()'),self.onClick)
self.connect(self.test_button1, QtCore.SIGNAL('clicked()'),self.onClick1)
def onClick(self):
if not app_global.global_dlg:
print 'new dialog created'
dlg=TestDialog(self)
dlg.exec_()
else:
try:
print "open saved dialog"
#app_global.global_dlg.setParent(self)
app_global.global_dlg.exec_()
except Exception,e:
print e
app_global.global_dlg=None
dlg=TestDialog(self)
dlg.exec_()
def onClick1(self):
#print 'change widget from TestWidget'
self.parent().setCentralWidget(AnotherWidget())
class AnotherWidget(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setGeometry(300, 300, 250, 150)
self.test_button = QtGui.QPushButton('back', self)
self.test_button.setGeometry(10, 60, 200, 35)
self.test_button1 = QtGui.QPushButton('Open Dialog', self)
self.test_button1.setGeometry(10, 10, 200, 35)
self.connect(self.test_button, QtCore.SIGNAL('clicked()'),self.onClick)
self.connect(self.test_button1, QtCore.SIGNAL('clicked()'),self.onClick1)
def onClick(self):
#print 'change widget from AnotherWidget'
w=TestWidget()
self.parent().setCentralWidget(w)
def onClick1(self):
if not app_global.global_dlg:
print 'new dialog created'
dlg=TestDialog(self)
dlg.exec_()
else:
try:
print "open saved dialog"
#app_global.global_dlg.setParent(self)
app_global.global_dlg.exec_()
except Exception,e:
print e
app_global.global_dlg=None
dlg=TestDialog(self)
dlg.exec_()
class MainApp(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, parent)
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Reference Demo')
t=TestWidget()
self.setCentralWidget(t)
app = QtGui.QApplication(sys.argv)
m = MainApp()
m.show()
sys.exit(app.exec_())
_______________________________________________
PyQt mailing list [email protected]
http://www.riverbankcomputing.com/mailman/listinfo/pyqt