【问题标题】:Connect multiple widget signals with one signal handler in PyQt在 PyQt 中使用一个信号处理程序连接多个小部件信号
【发布时间】:2012-12-02 13:40:54
【问题描述】:

我正在尝试使用 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 都被发送到信号处理程序,但我不知道为什么。

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您的帮助。我已经像你说的那样更正了它,但我现在得到一个错误:AttributeError:'str'对象没有属性'lineEdit1'。我不知道它是否重要,但信号处理程序位于不同的包中,所以我的行现在看起来像这样: item_widget.lineEdit1.textEdited.connect( lambda widget=item_widget: path_to_package.lineEdit_text_changed(self, widget) )
    • @user1870314。哪条线产生了错误?是发生在fill_listwidget 还是lineEdit_text_changed
    • Eroor 由:print(widget.lineEdit1.displayText()) line 生成
    • @user1870314。鉴于您问题中的代码,这根本没有意义。你一定在别处改变了一些东西。 (注意:使用反引号来格式化 cmets 中的代码块)。
    • 对不起。我错过了item_widget.lineEdit1.setText(data)data 中的“.setText”函数是一个字符串。我会查找其他拼写错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    • 2011-08-16
    • 1970-01-01
    • 2017-08-05
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    相关资源
    最近更新 更多