python - 在 PyQt 中使用一个信号处理程序连接多个小部件信号

标签 python python-3.x pyqt4 signals-slots

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

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

最佳答案

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

lambda 主体中的 item_widget 变量来自 封闭 范围,而不是 lambda本地范围。因此,每次循环都会创建一个新信号,但 item_widget 变量只是以分配给它的最后一个对象结束。

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

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

关于python - 在 PyQt 中使用一个信号处理程序连接多个小部件信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13669814/

相关文章:

python - PyQt4:按包含图标的列对 QTableWidget 进行排序

python - PyQt4 - 无法在继承自 QGraphicsItem (继承 QObject)的类中使用 QObject 的函数

python - 从 PyQt 的主窗口打开 Ui_Form

python - 如何接受来自 pygame GUI 的文本输入

python - 如何使用 QFileDialog 选项并检索 saveFileName?

python - Pandas pd.cut 时间戳 - "ValueError: bins must increase monotonically"

python - Python中具有多个条件的for循环

python - Tkinter IntVar 返回 PY_VAR0 而不是值

python - 如何干净地要求用户输入并允许多种类型?

python - 我如何组合 wxPython、abc 和元类 mixin?