python segfaulting, MemoryError (PyQt)
Denis L
no at spam.com
Tue Apr 28 11:10:51 EDT 2009
"Phil Thompson" <phil at riverbankcomputing.com> wrote in message
news:mailman.4690.1240925876.11746.python-list at python.org...
> On Tue, 28 Apr 2009 14:54:41 +0200, "Denis L" <no at spam.com> wrote:
>> "Phil Thompson" <phil at riverbankcomputing.com> wrote in message
>> news:mailman.4664.1240907352.11746.python-list at python.org...
>>> On Tue, 28 Apr 2009 03:53:34 +0200, "Denis L" <no at spam.com> wrote:
>>>> Hello,
>>>>
>>>> I'm experiencing odd errors on both windows and linux with the
> following
>>>> code:
>>>>
>>>> import sys
>>>> from PyQt4.QtCore import *
>>>> from PyQt4.QtGui import *
>>>>
>>>> class Options(QDialog):
>>>> def __init__(self, values):
>>>> QDialog.__init__(self)
>>>>
>>>> self.values = values
>>>>
>>>> fooEdit = QLineEdit(values['foo'])
>>>> self.connect(fooEdit, SIGNAL('textChanged(QString)'),
>>>> lambda value: self.optionChanged('foo', value))
>>>>
>>>> barEdit = QLineEdit(values['bar'])
>>>> self.connect(barEdit, SIGNAL('textChanged(QString)'),
>>>> lambda value: self.optionChanged('bar', value))
>>>>
>>>> layout = QVBoxLayout()
>>>> layout.addWidget(fooEdit)
>>>> layout.addWidget(barEdit)
>>>>
>>>> self.setLayout(layout)
>>>>
>>>> def optionChanged(self, option, value):
>>>> self.values[option] = value
>>>> print self.values
>>>>
>>>> def main(args):
>>>> app = QApplication(args)
>>>> values = dict(foo='', bar='')
>>>> dialog = Options(values)
>>>> dialog.show()
>>>> app.exec_()
>>>>
>>>> if __name__ == '__main__':
>>>> main(sys.argv)
>>>>
>>>>
>>>> If I type a character in fooEdit, another character in barEdit, and
> then
>>>> delete the character from barEdit I get an unhandled win32 exception
>>>> occured
>>>> in python.exe on windows and segfault on linux.
>>>>
>>>> If I type a character in fooEdit, delete it, and then type a character
>>>> in
>>>
>>>> barEdit I get:
>>>>
>>>> {'foo': PyQt4.QtCore.QString(u'a'), 'bar': ''}
>>>> {'foo': PyQt4.QtCore.QString(u''), 'bar': ''}
>>>> {'foo': Traceback (most recent call last):
>>>> File "L:\home\dev\python\test.py", line 17, in <lambda>
>>>> lambda value: self.optionChanged('bar', value))
>>>> File "L:\home\dev\python\test.py", line 27, in optionChanged
>>>> print self.values
>>>> MemoryError
>>>>
>>>> I'm using Python 2.5.4 and PyQt 4.4.3-1
>>>>
>>>> Thanks in advance for any help.
>>>
>>> Works fine for me with current versions.
>>>
>>> Phil
>>
>> I have noticed that if I do "self.values[option] = QString(value)"
>> instead of "self.values[option] = value" in optionChanged I don't get any
>
>> errors.
>>
>> Is it perhaps not safe to keep the reference to the lambda QString
>> argument?
>
> It shouldn't make any difference.
>
> Phil
Last idea, C++ declaration of textChanged signal is this:
void textChanged (const QString&text)
would self.values[option] = value store the reference to QString? And if so
is that safe, to access that object after my slot returns?
As far as I can see C++ equivalent would be
QString* pointer = &text; then derferencing that pointer later in the code.
I can see how this could cause problems.
Btw you are using PyQt 4.4.4 correct? What version of python?
More information about the Python-list
mailing list