pyside / pyqt:点击按钮上的动态创建的qlineedits获取值

时间:2013-10-03 10:39:00

标签: python pyqt pyside qlineedit

我有一个程序可以根据用户输入创建许多qlineedits和按钮:

screenshot of 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

编辑:如果用户在所有行上输入输入并且只按下一个按钮将所有这些输入作为列表或词典传递(每个“镜头”将添加更多行),这也没关系。

2 个答案:

答案 0 :(得分:3)

问题在于,每次浏览self.createShotBtn的值时,self.labelNameself.shotName都会被覆盖。

所以在最后一次运行中,它们是固定的,但仅限于最后一次迭代。

相反,您希望在循环中使用本地范围的变量,并可能将其存储在数组中供以后使用。

这段代码应该接近你所需要的,但是我可以看到self.shotNumberLst(返回一个数字?)和shotjump(这是一个很好的,或等于{{1}声明。

i

答案 1 :(得分:1)

试试这个,

while i <= int(seqNum):

    #create each widget
    createShotBtn = "ShotBtn"+str(i)
    self.createShotBtn = QtGui.QPushButton("Create Shot %s!" %str(self.shotNumberLst[i-1]))

    labelName = "labName"+str(i)
    self.labelName = QtGui.QLabel(self)
    self.labelName.setText("Enter Name Of Shot %s!" %str(self.shotNumberLst[i-1]))

    shotName = "shtName"+str(i)
    self.shotName = QtGui.QLineEdit(self)


    #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(self.printText)

    i += 1

def printText(self):
    print(self.shotName.text())

当您按下同一行上的按钮时,这将打印文本。