On Tue, 28 Apr 2009 17:10:51 +0200, "Denis L" <n...@spam.com> wrote: > "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.
If there was a bug with lambda slots it's been fixed by now. > Btw you are using PyQt 4.4.4 correct? What version of python? PyQt v4.5 snapshot, Python v2.6.2 and v3.0.1. Phil -- http://mail.python.org/mailman/listinfo/python-list