2017-09-14 1 views
0

Ich habe ein neues modales Dialogfeld hinzugefügt, das nach einem Kennwort fragt, wenn der Benutzer Zeilen löschen möchte. Ich habe die GUI mit Qt Designer erstellt. Ich kann die inventoryTable nicht in meiner GUI aufrufen.Attribut Fehler: Objekt hat keinen Attributfehler - Unterklassen-GUI PyQt4

Jedes Mal, wenn ich rufe secureDelete Funktion, ein Attribut Fehler auftritt, dass "'MainWindow_ui' Objekt hat kein Attribut 'inventoryTable'".

Kann mir jemand sagen, wie ich andere UIs richtig hinzufügen und in der Lage sein, dieses Attribut Fehler in der Zukunft zu vermeiden?

class Main(QtGui.QMainWindow): 
    def __init__(self): 
     QtGui.QMainWindow.__init__(self) 

     self.db = Database() 
     self.model = Model(self) 
     self.ui = MainWindow_ui() 
     self.ui.setupUi(self) 

     self.ui.removeItem.clicked.connect(lambda: self.start_Secure()) 
     self.ui.removeItem.setShortcut("Del") 

    def start_Secure(self): 
     self.accessForm = confirmDialog(self) 
     self.accessForm.show() 

class confirmDialog(QtGui.QDialog): 
    def __init__(self, parent=None): 
     super(confirmDialog, self).__init__(parent) 
     self.model = Model() 
     self.access_ui = Ui_Access() 
     self.access_ui.setupUi(self) 
     self.ui = MainWindow_ui() 

     self.access_ui.username.returnPressed.connect(self.secureDelete) 
     self.access_ui.password.returnPressed.connect(self.secureDelete) 
     self.access_ui.confirmButton.clicked.connect(self.secureDelete) 

    def secureDelete(self): 
     members = {'user': 'password'} 
     username = self.access_ui.username.text() 
     password = self.access_ui.password.text() 

     if username in members: 
      enteredPass = members.get(username) 
      indices = self.ui.inventoryTable.selectionModel().selectedRows() 
      if password == enteredPass: 
       for index in sorted(indices): 
        self.model.removeRow(index.row()) 
      else: 
       self.model.revertRow(indices) 

Antwort

1

Die Klassen von Qt Designer erzeugt bieten die setupUi() Verfahren die Design-Elemente zu erstellen, so dass Sie in Ihrem Fall nicht genannt haben, und folglich nie die inventoryTable, sondern auch Leiten geschaffen erreichen diese Funktion nicht Ihr Ziel, da Sie eine neue Instanz erstellen würden.

In Ihrem speziellen Fall, wie Sie sich selbst als Eltern von confirmDialog bestanden haben:

self.accessForm = confirmDialog(self) 

Dann sind Sie Haupt durch die parent() Methode in Ihrem Fall zugreifen können wie folgt vor:

class confirmDialog(QtGui.QDialog): 
    def __init__(self, parent=None): 
     [...] 
     self.access_ui.setupUi(self) 
     # self.ui = MainWindow_ui() 
     [...] 

    def secureDelete(self): 
     [...] 

     if username in members: 
      enteredPass = members.get(username) 
      indices = self.parent().ui.inventoryTable.selectionModel().selectedRows() 
      [...] 
Verwandte Themen