2016-06-20 5 views
0

背景

私はPyQT5で簡単なアプリケーションを書いています。主QWidgetQGridLayoutであり、視覚的結果は、このようなものであるべきである。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()メソッドに渡された値を代入する方法はありますか?これを達成するための異なるアプローチや方法も歓迎されます。

答えて

1

はあなたのラムダxは解にかなり近いです:ステートメント、あなただけの1つの小さな作品逃しているあなたのrow変数が大きく変化するので、過渡値

を保存するためにラムダを使用し

、あなた関数が作成されるときに値を格納する必要があります。 self.clickedは現在のrowを参照しています。それを支援するために、あなたは次のようにあなたのラムダを変更することができますので:

# current: x is the event, row is looked up when the function is called 
lambda x: self.clicked(row) 

# New: x is the event, r is frozen when the function is created 
lambda x, r=row: self.clicked(r) 

これは、各ラムダは作成時にローカルrセットを持っているというよりも機能が必要な場合rowを見上げるようになります。

+0

ありがとうございます!それはトリックを行いました。実際には 'row'変数のローカルコピーを作成することで、私が望むものが正確に実行されます。 – nKn

関連する問題