2

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())

ご覧のとおり、これらのシグナルを同じ方法で処理したいので、すべてのウィジェットに 1 つのシグナル ハンドラーを追加します。問題は、最後に追加されたウィジェットのみが適切に処理されることです。他のウィジェットの「lineEdit1」フィールドを変更しても、最後のウィジェットのフィールドが印刷されます。


1 最初のウィジェットの lineEdit を変更します
2 最後のウィジェットの lineEdit を出力します
3 2 番目のウィジェットの lineEdit を変更します
4 最後のウィジェットの lineEdit を出力し
ます ...

どのウィジェットの lineEdit が変更されていても、lastWidget がシグナル ハンドラに送信されていると思いますが、その理由はわかりません。

この問題の解決方法を教えてください。

4

1 に答える 1

0

これは、一般的なスコーピングの問題です。

item_widget本体の変数は、のローカルスコープではなく、囲んでいるlambdaスコープから取得されています。したがって、ループのたびに新しいシグナルが作成されますが、変数は最後に割り当てられたオブジェクトで終了します。lambdaitem_widget

これを修正するには、次のようにデフォルトの引数を使用します。

item_widget.lineEdit1.textEdited.connect(
    lambda widget=item_widget: self.lineEdit_text_changed(widget))
于 2012-12-02T16:51:36.380 に答える