関数の引数として、シグナルを呼び出すオブジェクトを渡し、その関数でそのオブジェクトを操作できるようにします。そのオブジェクトはQLineEditウィジェットです。次に例を示します。
self.fieldList = []
for i in range(10):
self.valueField = QtGui.QLineEdit()
self.fieldList.append(self.valueField)
self.fieldList[i].cursorPositionChanged.connect(lambda: (self.checkState(self.fieldList[i], palette1, palette2)))
def checkState(self, line, palette1, palette2):
if len(line.text()) > 3:
line.setPalette(palette1)
else:
line.setPalette(palette2)
ご覧のとおり、checkState()関数の名前行を使用してリスト要素self.fieldList[i]を引数として渡そうとしています。checkState()関数でfieldList要素(つまり、 self.fieldList [0])を明示的に定義すると、コードは完全に機能しますが、引数として渡すことはできません。私は何が間違っているのですか?
ところで。プログラムを実行しようとしても、コンパイラーはエラーメッセージを表示しませんが、想定どおりの動作をしません(3文字を超える文字を書き込んだ場合はQLineEditの色を変更してください)。
編集:
@ dex19dt
はい、これは一例ですが、あなたは正しいです!最後のQLineEditのみが正常に機能します。
問題は、ウィジェットの数が選択したレイヤーによって異なるため、これらすべてのウィジェットに名前を付けることができないことです。つまり、ウィジェットが5つある場合もあれば、11または75の場合もあります。
これらのウィジェットに簡単に名前を付けて、次のようにテキストを設定できます。
self.fieldList[i].setObjectName(_fromUtf8("attributeValueField_{0}".format(i)))
self.fieldList[i].setText(_fromUtf8("{0}".format(value.toString())))
これはすべてのウィジェットで問題なく機能しますが、信号を定義する方法がわかりませんか?アイデアはありますか?
編集:
@ dex19dt
OK、それで私はインデックスが関数呼び出しに「固執」しないというこの問題について尋ねました、そしてこれがちょうどpythonが機能する方法であることがわかりました、そしてこの問題を修正するために私はこの行を置き換える必要がありました:
self.fieldList[i].cursorPositionChanged.connect(lambda: (self.checkState(self.fieldList[i], palette1, palette2)))
これで:
self.fieldList[i].cursorPositionChanged.connect(lambda old, new, i=i: (self.checkState(self.fieldList[i], palette1, palette2)))
したがって、このようにして、現在のインデックスがシグナルインデックスにコピーされます。なぜあるのかよくわかりませんがold, new
。ラムダ関数を参照しているのでしょうか、それとも単に左i
を古い変数として、右i
を新しい変数として定義しているのでしょうか...グーグルで試しましたが、成功しませんでした。