2

ユーザーの入力に応じて、いくつかのqlineeditとボタンを作成するプログラムがあります。

GUI のスクリーンショット

上の画像では、グレーアウトされた [次へ] ボタンをクリックした後に、4 行のボタンが追加されています。ここで、対応するボタンがクリックされたときに、ユーザーからの入力を関数に取得したいと考えています ([ショット 1 を作成] をクリックします! --> 引数として渡された「exShot1」を使用して関数に移動します)。

問題は、ループで作成されたときに各qlineとボタンの名前を取得する方法がわかりません。ループ内で一意の変数を作成できると思いますが、それは正しくありません。使ってみsetObjectNameましたが、それを使ってテキストを呼び出す方法がわかりません。私はまた、Lamdbaで失敗した試みをしました(これはどういうわけか正しい方法かもしれないと感じています)。これは、ユーザー入力が変更されたときに名前を取得し、追跡する必要があることの組み合わせだと思います.

私は実験しtextChangedましたが、ループの最後のエントリで動作するようになりましたが、他のqlinesとボタンでは動作しませんでした)

関連コード:

while i <= int(seqNum):
    #create each widget
    self.createShotBtn = QtGui.QPushButton("Create Shot %s!" %str(self.shotNumberLst[i-1]))
    self.labelName = QtGui.QLabel(self)
    self.labelName.setText("Enter Name Of Shot %s!" %str(self.shotNumberLst[i-1]))
    self.shotName = QtGui.QLineEdit(self)
    self.shotName.setObjectName("shot"+str(i))

    #add widget to layout
    self.grid.addWidget(self.labelName, 11+shotjump,0)
    self.grid.addWidget(self.shotName,11+shotjump,1)
    self.grid.addWidget(self.createShotBtn, 11+shotjump,2)

    #Press button that makes magic happen
    self.createShotBtn.clicked.connect(???)

    i += 1

編集: ユーザーがすべての行に入力を入力し、それらすべての入力をリストまたは辞書として渡す 1 つのボタンを押しただけでも問題ありません (「ショット」ごとにさらに行が追加されます)。

4

2 に答える 2

3

問題は、実行のたびにself.createShotBtn、 、self.labelNameおよびの値self.shotNameがオーバーライドされることです。

したがって、最後の実行では修正されますが、最後の反復のみです。

代わりに、ループ内でローカルにスコープされた変数を使用し、後で使用するために配列に格納する可能性があります。

このコードはあなたが必要としているものに近いはずですが、どこでself.shotNumberLst(どれが数値を返しますか?) とshotjump(どれがオフェストか、または等しいかi) が宣言されていることがわかります。

self.shots = []
for i in range(seqNum): # Changed while to for, so you don't need to increment
    #create each widget
    createShotBtn = QtGui.QPushButton("Create Shot %s!" %str(self.shotNumberLst[i-1]))
    labelName = QtGui.QLabel(self)
    labelName.setText("Enter Name Of Shot %s!" %str(self.shotNumberLst[i-1]))
    shotName = QtGui.QLineEdit(self)

    self.shots.append({"button":createShotBtn,
                       "name":shotName)) # Store for later if needed.

    #add widget to layout
    self.grid.addWidget(labelName, 11+shotjump,0)
    self.grid.addWidget(shotName,11+shotjump,1)
    self.grid.addWidget(createShotBtn, 11+shotjump,2)

    #Press button that makes magic happen
    createShotBtn.clicked.connect(self.createShot(i))

#elsewhere
def createShot(self,index):
    print self.shots[index]["name"].text
于 2013-10-04T01:22:28.767 に答える