我正在尝试使用PyQT4在Python3中创建简单的apllicatin。主窗口显示几个自定义小部件。每个小部件都包含一个QLineEdit小部件。这是一些代码:
def fill_listwidget (self, widget):
i=0
for data in dataList:
item = QListWidgetItem(myListWidget)
#create my custom widget
item_widget = Ui_Form("Widget")
item_widget.lineEdit1.setText(data)
item_widget.index =i
i=i+1
widget.addItem(item)
widget.setItemWidget(item,item_widget)
#########
def temp (self):
lineEdit_text_changed(self, item_widget)
print(repr(item_widget))
print(repr(self))
item_widget.lineEdit1.textEdited.connect(temp)
#########
#item_widget.lineEdit1.textEdited.connect(lambda: (lineEdit_text_changed(self, item_widget)))
def lineEdit_text_changed(self, widget, data="Null"):
print(widget.lineEdit1.displayText())
正如您所看到的,我为所有小部件添加了一个信号处理程序,因为我想以相同的方式处理这些信号。问题是只有最后添加的小部件才能正确处理。当我修改其他小部件的“lineEdit1”字段时,仍会打印最后一个小部件的字段。
以下是它的工作原理:
1我修改了第一个小部件的lineEdit
2最后一个小部件的lineEdit被打印
3我修改第二个小部件的lineEdit
4最后一个小部件的lineEdit被打印
...
我假设无论哪个小部件的lineEdit被修改,lastWidget都被发送到信号处理程序,但我不知道为什么。
请告诉我如何解决这个问题。
答案 0 :(得分:0)
这是一个常见的范围问题。
item_widget
正文中的lambda
变量来自封闭范围,而不是lambda
的 local 范围。因此,每次循环时,都会创建一个新信号,但item_widget
变量最终会分配给它的最后一个对象。
要修复它,请使用默认参数,如下所示:
item_widget.lineEdit1.textEdited.connect(
lambda widget=item_widget: self.lineEdit_text_changed(widget))