2015-01-26 33 views
0

我創建了一個佈局,一旦我將它分配到列表中,但是爲了創建一個用戶,我需要線編輯和comboxes中的值,但是會自動添加標籤和lineedits你可以看到我已經設置了每個對象名稱,我如何訪問我的tryCreateUser()函數中的所有值?正如你可以看到我通過打印編輯檢查,但只是給了我最後一個對象!提前感謝您的幫助!Pyqt4在創建動態表單時訪問對象

def addNewUser(self): 
    def tryCreateUser(): 
     print(edit) 

    self.deleteLayout(self.dynamicFrame.layout()) 

    grid = QtGui.QGridLayout() 
    grid.setSpacing(10) 
    row = 1 
    column = 1 
    edit = ['First Name', 1, 'Last Name', 1, 'Date of Birth', 2, '', 'Gender', 3, 'Access Level', 4, 'Password', 5, 'Verify Password', 5] 

    for item in edit: 
     if item == '': 
      self.dob = QtGui.QLabel() 
      grid.addWidget(self.dob, 3, 3) 
      column -= 1   
     else: 
      if item == 1: 
       edit = QtGui.QLineEdit() 
      elif item == 2: 
       edit = QtGui.QPushButton('Choose') 
       edit.clicked.connect(self.openCal) 
      elif item == 3: 
       edit = QtGui.QComboBox() 
       edit.addItem('Male') 
       edit.addItem('Female') 
      elif item == 4: 
       edit = QtGui.QComboBox() 
       edit.addItem('General Staff') 
       edit.addItem('Stock Admin') 
       edit.addItem('Manager') 
      elif item == 5: 
       edit = QtGui.QLineEdit() 
       edit.setEchoMode(QtGui.QLineEdit.Password) 
      else: 
       edit = QtGui.QLabel(item) 

     edit.setObjectName(str(item)) 
     grid.addWidget(edit, row, column) 
     if column >= 2: 
      column = 1 
      row += 1 
     else: 
      column += 1 

    createButton = QtGui.QPushButton("Create User") 
    createButton.clicked.connect(tryCreateUser) 
    cancelButton = QtGui.QPushButton("Cancel") 
    cancelButton.clicked.connect(self.populateUser) 
    grid.addWidget(createButton, row , column) 
    grid.addWidget(cancelButton, row, (column+1)) 

    self.dynamicFrame.setLayout(grid) 

回答

2

你應該讓每個按鈕自己註冊一個字典。試試這個:

from collections import namedtuple 

Button = namedtuple('Button', ["title", "to_do"]) 

buttons_to_make = [Button("First Name", [1]), 
        Button("Last Name", [1]), 
        Button("Date of Birth", [2, '']), 
        ...] 

self.buttons = {} 
for button in buttons_to_make: 
    for action in button.to_do: 
     # your big long if/elif structure here, e.g.: 
     if action == 1: 
      b = QtGui.QLineEdit() 
     elif action == 2: 
      b = QtGui.QPushButton('Choose') 
      b.clicked.connect(self.openCal) 
     # etc 
    self.buttons[button.title] = b 

然後你有你的東西有一箇中央存儲庫中buttons,並且可以進行迭代。

def tryCreateUser(): 
    for title, button in self.buttons.items(): 
     print("Title is {}, button obj is {}".format(title, button)) 

請注意,這不完全是我的做法,但它是最接近您的原始示例。老實說,那些每個如果塊應該是其自身的功能,這樣你就會有這樣的:

def __create_QLineEdit(self): 
    b = QtGui.QLineEdit() 
    return b 

def __create_QPushButton(self): 
    b = QtGui.QPushButton("Choose") 
    b.clicked.connect(self.openCal) 
    self.dob = QtGui.QLabel() 
    grid.addWidget(self.dob, 3, 3) 
    column -= 1 
    return b 

... 

然後,你定義namedtuple爲:

Button = namedtuple("Button", ['name','action']) 

,並定義爲buttons_to_make

buttons_to_make = [Button("First Name", self.__create_QLineEdit), 
        Button("Last Name", self.__create_QLineEdit), 
        Button("Date of Birth", self.__create_QPushButton), 
        ...] 

,並與執行:

buttons = {} 
for button in buttons_to_make: 
    name, action = button 
    buttons[name] = action() 
+0

謝謝!這樣可行! – Inthuson 2015-01-31 20:25:11