2013-10-03 34 views
1

我有創建許多依賴於用戶輸入qlineedits和按鈕的程序:pyside/PyQt的:獲取有關按鈕從動態創建qlineedits值點擊

screenshot of GUI

在圖像上面4行有在灰色的「下一步」按鈕被點擊後添加了一個按鈕。現在我想在點擊相應的按鈕時將用戶的輸入變成一個函數(點擊「Create Shot 1! - >轉到一個帶有」exShot1「作爲參數的函數)

事情是我在循環中創建每個qline和button時,我不知道如何獲取每個qline和button的名稱,我想我可以在循環中創建唯一的變量,但這並不正確,我試過使用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 

編輯:這也將是罰款,如果用戶對所有的線路輸入的輸入,只是壓即通過了所有這些輸入作爲一個列表或一個字典按鈕(將會有更多的每行「發射」加入)

回答

2

的問題是,在每個通過的self.createShotBtnself.labelNameself.shotName值運行被覆蓋。

因此,在最後一次運行中,它們是固定的,但僅適用於最後一次迭代。

取而代之,您希望在循環中使用本地作用域變量,並可能將其存儲在數組中供以後使用。

此代碼應接近你需要什麼,但我能看到self.shotNumberLst(它返回一個數字?)和shotjump(這是一個offest或等於給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