【问题标题】:pyside / pyqt: Getting values from dynamically created qlineedits on button clickedpyside / pyqt:在单击按钮时从动态创建的 qlineedits 中获取值
【发布时间】:2013-10-10 00:31:43
【问题描述】:

我有一个程序可以根据用户输入创建许多 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

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

【问题讨论】:

    标签: python pyqt pyside qlineedit


    【解决方案1】:

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

    【讨论】:

      【解决方案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())
      

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

      【讨论】:

        猜你喜欢
        • 2018-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-24
        • 1970-01-01
        • 1970-01-01
        • 2016-12-04
        • 1970-01-01
        相关资源
        最近更新 更多