2

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

图形用户界面截图

在点击灰色的“下一步”按钮后,在上面的图像中添加了 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

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

4

2 回答 2

3

问题在于,在每次运行时self.createShotBtnself.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 回答
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())

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

于 2018-05-15T12:56:26.600 回答