2017-02-21 16 views
0

I 2 Sätze 3 Tasten, die jeweils mit einem QDialogButtonBox() wie folgt:Gleiche Signale aber auf verschiedene Tasten

  • "Hinzufügen" (AcceptRole)
  • "Entfernen" (RejectRole)
  • "Clear" (ResetRole)

so etwas:

self.set1_btns = QtGui.QDialogButtonBox() 
self.set1_btns.addButton("Add", QtGui.QDialogButtonBox.AcceptRole) 
self.set1_btns.addButton("Remove", QtGui.QDialogButtonBox.RejectRole) 
self.set1_btns.addButton("Clear", QtGui.QDialogButtonBox.ResetRole) 

wo ihre Rolle ungefähr gleich ist, der einzige Unterschied zwischen ihnen ist, dass sie jedes ihrer eigenen QListWidget, das ich ihnen zugewiesen habe, hinzufügen/entfernen/löschen werde.

Dinge zu vereinfachen, sind die Mengen wie folgt: (Listex - QListWidget, Hinzufügen/Entfernen/Löschen - QPushButton)

  • Set1: List1, Add1, Remove1, Clear1
  • Set2: List2, add2, Remove2, clear2

Dies ist mein Code:

def connect_signals(self): 
    # List1 functions - Add, Remove, Clear 
    self.set1_btns.accepted.connect(self.add_objects) 
    self.set1_btns.rejected.connect(self.remove_objects) 
    self.set1_btns.clicked.connect(self.clear_objects) 

    # List2 functions - Add, Remove, Clear 
    self.set2_btns.accepted.connect(self.add_objects) 
    self.set2_btns.rejected.connect(self.remove_objects) 
    self.set2_btns.clicked.connect(self.clear_objects) 

def add_objects(self): 
    selections = ['aaa', 'bbb', 'ccc'] 
    for sel in selections: 
     # I can only define it to add to list1 
     self.list1.addItem(sel) 

def remove_objects(self): 
    for item in self.list1.selectedItems(): 
     self.list1.takeItem(self.list1.row(item)) 

def clear_objects(self): 
    # self.list1_btns are the QDialogButtons 
    role = self.list1_btns.buttonRole(button) 
    if role == QtGui.QDialogButtonBox.ResetRole: 
     self.list1.clear() 

Meine Frage hier wäre, wie kann ich meiner Funktion sagen, welcher Knopf, von welchem ​​der Sätze zu klicken ist?

Aus Gründen der Vernunft, ich dachte, es wird ideal sein, um in 1 Funktionen zu kombinieren, da sie etwa gleich arbeiten, anstatt 2 separate Funktionen zu schreiben, wo die einzige Änderungen die QListWidget-Variable sein wird.

Antwort

2

können Sie passieren die QListWidget Objekte als Argumente an diese Methoden wie folgt:

def connect_signals(self): 
    # List1 functions - Add, Remove, Clear 
    self.add1.accepted.connect(lambda: self.add_objects(self.list1)) 
    self.remove1.rejected.connect(lambda: self.remove_objects(self.list1)) 
    self.clear1.clicked.connect(lambda: self.clear_objects(self.list1)) 

    # List2 functions - Add, Remove, Clear 
    self.add2.accepted.connect(lambda: self.add_objects(self.list2)) 
    self.remove2.rejected.connect(lambda: self.remove_objects(self.list2)) 
    self.clear2.clicked.connect(lambda: self.clear_objects(self.list2)) 

def add_objects(self, listWidget): 
    selections = ['aaa', 'bbb', 'ccc'] 
    for sel in selections: 
     # I can only define it to add to list1 
     listWidget.addItem(sel) 

def remove_objects(self, listWidget): 
    for item in listWidget.selectedItems(): 
     listWidget.takeItem(listWidget.row(item)) 

def clear_objects(self, listWidget): 
    # self.list1_btns are the QDialogButtons 
    #role = self.list1_btns.buttonRole(button) 
    #if role == QtGui.QDialogButtonBox.ResetRole: 
    listWidget.clear() 

Wo lambda eine anonyme Funktion ist, die von Python zur Verfügung gestellt; Das Signal ist mit dieser anonymen Funktion verbunden, die einen Aufruf an Ihre Methode enthält und die list1 oder list2 als Argumente übergibt. Dann werden die Listenobjekte in Ihren Methoden entsprechend verwendet.

Wie Sie die clear Tasten nur mit clear Methode verbinden, glaube ich, dass es keine Notwendigkeit gibt, in clear_objects die Rolle des Knopfes einzuchecken. Wenn Sie die Rolle überprüfen möchten, können Sie die self.list1_btns und self.list2_btns als zweites Argument an die Methode clear_objects übergeben.

+0

Bitte ignorieren Sie meinen Beitrag .. Es funktioniert tatsächlich. Ja, anfänglich verband ich 'clear' Methode mit' clear' Taste – dissidia

+0

Nur eine kurze Frage, ist es möglich, dass sich die 'add' Tasten des 2 Sets instinktiv kennen? Z.B. wenn ich 'itemA' in list1 hinzufüge, wenn ich den add button für set2 drücke, sollte list2 nicht 'itemA' hinzufügen, da es bereits in list1 ist. – dissidia

+0

Ich habe gerade festgestellt, dass dieser Code alle neuen Zusätze löscht, wenn ich versuche hinzuzufügen irgendwelche neuen Objekte. Z.B. Wenn die Liste bereits 3 Objekte enthält und ich versucht habe, ein weiteres neues Objekt hinzuzufügen, werden die Objekte in der Liste gelöscht und jetzt wird die Liste nur dieses 'neue' einzelne Objekt enthalten, möglicherweise nur weil '.clicked.connect' verwendet wird – dissidia

Verwandte Themen