背景
私はPyQT5で簡単なアプリケーションを書いています。主QWidget
はQGridLayout
であり、視覚的結果は、このようなものであるべきである。PyQT5の宣言時にイベントのパラメータ値を設定していますか?
+-----------------------------------+
row1 | QLabelA | QLabelB | QLabelC |
+-----------------------------------+
row2 | QLabelA | QLabelB | QLabelC |
+-----------------------------------+
row3 | QLabelA | QLabelB | QLabelC |
+-----------------------------------+
...
このQGridLayout
は、各反復が行を表すループを使用して充填されているので、私はこのようなものがあります
row = 0
self.grid = QGridLayout()
while row < 10:
filepath = 'icon.png'
icon = QImage(filepath)
QLabelA = QLabel()
QLabelA.setPixmap(QPixmap.fromImage(icon))
QLabelB = QLabel()
QLabelB.setPixmap(QPixmap.fromImage(icon))
QLabelC = QLabel()
QLabelC.setPixmap(QPixmap.fromImage(icon))
self.grid.addWidget(QLabelA, row, 0)
self.grid.addWidget(QLabelB, row, 1)
self.grid.addWidget(QLabelC, row, 2)
row += 1
を
これまでのところ、これはかなりうまく機能します。
問題私の目的は、視覚的イメージであるこれらQLabel
Sのそれぞれは、それらのそれぞれの上に、ユーザの簡単なクリックした後にトリガされなければならない関連する作用を有することを確認することである
。そのために、私はそれがオブジェクトの上にクリックした後にメソッドを呼び出すことができますので、私は単純にこれを行うことがa propertyが見つかりました:
QLabelA.mousePressedEvent = this.do_something
def do_something(self, event):
...
最初の問題は、見やすいです:私はQLabel
秒のどれを識別するための方法を必要とします(つまり、どの行に)クリックされたかを示します。そのために、mousePressedEvent
にカスタムパラメータを追加する方法が見つかりました。さんはクリックでclicked()
メソッドを呼び出しますQLabelA
分野に焦点を当ててみましょう:
QLabelA.mousePressEvent = lambda x: self.clicked(row)
def clicked(self, row):
print row
ここで大きな問題が来る:これらQLabelA
の各フィールドには、row
変数に依存しており、それらは作成時に評価されますが、でされていません代わりにクリック時間。したがって、ユーザがclicked()
メソッド内で行0でQLabelA
をクリックした場合、row
は、定義時にあった最後のrow
値(つまり、QGridLayout
の行数)を持つことになります。 self.grid
は5行がある場合は、ユーザーがクリックは、row
は常に5
row
値とのリストを定義することでこの制限をworkaroundingみました
の値を持つことになりますどこかは問題ではありませんが、それは以来、何の違いを行っていませんクリック時の値はrow
に依存しています。
質問
が意図したとおり、この作業を行うと作成時間の代わりに、クリック時にclick()
メソッドに渡された値を代入する方法はありますか?これを達成するための異なるアプローチや方法も歓迎されます。
ありがとうございます!それはトリックを行いました。実際には 'row'変数のローカルコピーを作成することで、私が望むものが正確に実行されます。 – nKn