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

2024-07-04 09:08:29 发布

您现在位置:Python中文网/ 问答频道 /正文

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

screenshot of GUI

在上面的图像中,4行已经添加了一个按钮后,灰色的“下一步”按钮被点击。现在我想让用户在点击相应按钮时输入到函数中(单击“CreateShot1!-->;转到以“exShot1”作为参数传递的函数)。在

问题是我不知道如何在循环中创建每个qline和button的名称。我想我可以在循环中创建唯一的变量,但这感觉不对。我尝试过使用setObjectName,但我不知道如何使用它来调用文本。我在Lamdba上也做了一次不成功的尝试(我觉得这可能是一个正确的方法),我相信这是一个必须获取名称和跟踪用户输入更改的组合。在

我用textChanged做了实验,我让它在循环的最后一个条目上工作,但对其他的qline和按钮不起作用)

相关代码:

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

编辑:如果用户在所有行中输入输入,只需按一个按钮,就可以将所有输入作为列表或dict传递(每个“shot”将添加更多行)


Tags: 函数用户self名称button按钮gridstr
2条回答

试试这个

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())

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

问题是每次遍历self.createShotBtnself.labelName和{}的值都会被重写。在

因此,在最后一次运行时,它们是固定的,但只适用于最后一次迭代。在

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

这段代码应该接近您需要的,但是我可以看到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

相关问题 更多 >

    热门问题