2017-08-13 3 views
0

Ich verwende ein QListWidget, das einfach eine Liste von Objekten anzeigt. Ich erlaube dem Benutzer, diese Elemente über das interne Ziehen und Ablegen neu anzuordnen. Alles funktioniert, aber ich muss jetzt eine Überprüfung hinzufügen, wenn der Benutzer versucht, die Datei zu löschen (neu anzuordnen). Wenn die Überprüfung fehlschlägt, muss die ursprüngliche Reihenfolge programmgesteuert wiederhergestellt werden. Hier ist was ich habe:Wie programmatisch aus einer Drag-Drop-Operation in einem QListWidget zurück?

class SequenceControl(QListWidget): 
    def __init__(self, parent = None): 
     super(SequenceControl, self).__init__(parent) 

     self.initialIndex = 0 
     self.selectedObject = None 
     self.setAcceptDrops(True) 
     self.setDragEnabled(True) 
     self.setDragDropMode(QAbstractItemView.InternalMove) 


    def dragEnterEvent(self, event): 
     super(SequenceControl, self).dragEnterEvent(event) 

     self.selectedObject = self.currentItem() 
     self.initialIndex = self.currentRow() 

    def dropEvent(self, event): 
     super(SequenceControl, self).dropEvent(event) 

     # Some logic here (not shown) to see if the drop is not 
     # allowed. Assume it isn't: 
     warningDialog = MyWarningDialog(self.parent) 
     ProceedAnyway = warningDialog.exec_() 

     if ProceedAnyway: 
      # Do stuff... 
     else: 
      # Here's the problem. I need to place the item being dropped 
      # back in its initial pre-drag/drop location. The following 
      # naïve attempt doesn't work: 
      self.insertItem(self.initialIndex, self.selectedObject) 

Das oben genannte ist definitiv falsch (glaube ich), weil es das Einzelteil duplizieren kann. Aber abgesehen davon besteht das Problem darin, dass es keinen Effekt zu haben scheint. Ich glaube, das Drop-Event hat Vorrang vor allem, was ich bei der Nachbestellung mache. Aber das ist nur eine Theorie. Kennt jemand den richtigen Weg dazu?

Antwort

1

Um die Änderung rückgängig zu machen, müssen wir zuerst das Zielelement entfernen. Dazu verwenden wir takeItem(), das neben dem Entfernen das Element zurückgibt und es dann mithilfe der insertItem()-Funktion in die Quellposition einfügt.

class SequenceControl(QListWidget): 
    def __init__(self, parent=None): 
     super(SequenceControl, self).__init__(parent) 

     self.fromPos = None 
     self.setAcceptDrops(True) 
     self.setDragEnabled(True) 
     self.setDragDropMode(QAbstractItemView.InternalMove) 

    def dragEnterEvent(self, event): 
     super(SequenceControl, self).dragEnterEvent(event) 
     self.fromPos = self.currentRow() 

    def dropEvent(self, event): 
     super(SequenceControl, self).dropEvent(event) 

     reply = QMessageBox.question(None, "Revert to Drag and Drop", 
            "Do you want to keep the change?", 
            QMessageBox.Yes | QMessageBox.No) 
     if reply == QMessageBox.Yes: 
      print("Do stuff...") 
     else: 
      currentItem = self.takeItem(self.currentRow()) 
      self.insertItem(self.fromPos, currentItem) 
Verwandte Themen