"Phil Thompson" <p...@riverbankcomputing.com> wrote in message news:mailman.4690.1240925876.11746.python-l...@python.org... > On Tue, 28 Apr 2009 14:54:41 +0200, "Denis L" <n...@spam.com> wrote: >> "Phil Thompson" <p...@riverbankcomputing.com> wrote in message >> news:mailman.4664.1240907352.11746.python-l...@python.org... >>> On Tue, 28 Apr 2009 03:53:34 +0200, "Denis L" <n...@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? -- http://mail.python.org/mailman/listinfo/python-list