在PyQ中用一个信号处理程序连接多个widget信号

2024-04-19 22:14:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用PyQT4在Python3中创建简单的applicatin。主窗口显示几个定制的小部件。每个小部件都包含一个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被修改,最后一个小部件都被发送到信号处理程序,但我不知道为什么。在

请告诉我如何解决这个问题。在


Tags: textselfdata部件defconnectwidgetitem
1条回答
网友
1楼 · 发布于 2024-04-19 22:14:08

这是一个常见的范围界定问题。在

^{主体中的item_widget变量来自于封闭的作用域,而不是lambda局部作用域。因此,每次循环时,都会创建一个新的信号,但是item_widget变量只会以最后一个分配给它的对象结束。在

要修复它,请使用默认参数,如下所示:

item_widget.lineEdit1.textEdited.connect(
    lambda widget=item_widget: self.lineEdit_text_changed(widget))

相关问题 更多 >