[Tutor] PyQt segfault

David Boddie david at boddie.org.uk
Sat Dec 1 01:04:04 CET 2007


On Fri Nov 30 18:56:04 CET 2007, Eric Brunson wrote:

> This comboboxsegfault.py doesn't seem to do anything on my box, but I
> did get an "MemoryError" and a stack trace when I ran cbox.py and
> changed the dropdown menu selection.
> 
> I changed the line:
>         Globals.changedtext = qstring
> 
> to:
>         Globals.changedtext = qstring[:]
> 
> to get a copy of qstring instead of a reference to it, and cbox.py seems
> to execute without problems now.  My guess is that the qstring is being
> disposed of when the dialog is torn down.

Something like that, yes. The internal character data becomes invalid, but
there's still a reference to the QString object.

Here's the original code posted by Tiago:

> class Combobox(QtGui.QDialog):
>     def __init__(self):
>         QtGui.QDialog.__init__(self)
>         self.ui = Ui_Dialog()
>         self.ui.setupUi(self)
>                         
>         self.connect(self.ui.comboBox, QtCore.SIGNAL("activated(QString)"),
>                      self.save)
>         def save(self, qstring):
>             # Here it works:
>             #Aux.mystring = unicode(qstring)
>             Aux.mystring = qstring

The correct way to handle this is commented out: to take a copy of the data,
as you pointed out. This could be done by converting it to a Python unicode
object, as shown, or by copying the QString:

  Aux.mystring = QString(string)

[Off topic, but PyQt-related: You need to explicitly copy value types with
PyQt because the semantics of copying objects with Python are different to
those for copying Qt's value classes in C++. In Python, you just bind an
object to a name, but the equivalent assignment in C++ is basically just
creating an additional reference to the same object.]

David



More information about the Tutor mailing list