Seite 1 von 1

Drag&Drop - MoveAction in TreeView abweisen

Verfasst: 21. September 2010 11:48
von OscarWild
Hallo,

in einem abgeleiteten QTreeView soll ein internes Verschieben der Elemente möglich sein.
Nach dem Drop muss das Verschieben jedoch in Abhängigkeit vom Inhalt durch den Anwender bestätigt werden. Dazu akzeptiere ich im dragMoveEvent() der View eine MoveAction, und öffne in der Methode dropMimeData() des zugehörigen Modells einen Dialog, mit dem die Entscheidung getroffen wird:

View-Klasse (Derivat von QTreeView):

Code: Alles auswählen

  ...
  def dragMoveEvent (self, event):
    if event.source() == self:
      event.setDropAction(Qt.MoveAction)
      event.accept()
      ...
Model-Klasse (Derivat von QAbstractItemModel):

Code: Alles auswählen

  def dropMimeData (self, data, action, row, column, parent_index)
    ...
    if not requestUserConfirmation(data):
      return False
    ...  

Nun das Problem:
Bricht der Anwender das Verschieben per Dialog ab, löscht Qt dennoch das ursprüngliche Element aufgrund der MoveAction. Verwende ich stattdessen eine CopyAction, habe ich keine Ahnung, wie ich innerhalb von dropMimeData() das ursprüngliche Element löschen soll, falls der Benutzer das Verschieben bestätigt.

Hat jemand einen Rat für mich?


Gruß + vorab vielen Dank
OscarWild

Verfasst: 21. September 2010 15:02
von OscarWild
Ich habe nun die Ursache gefunden. QTreeView.dropEvent() akzeptiert die MoveAction in der Standardimplementierung scheinbar unabhängig vom Ergebnis von QAbstractItemModel.dropMimeData(). Wenn ich das dropEvent() folgendermaßen implementiere, funktioniert alles wie beabsichtigt:

Code: Alles auswählen

  def dropEvent (self, event):
    model    = self.model()
    index     = self.indexAt(event.pos())
    accepted = model.dropMimeData(event.mimeData(), Qt.MoveAction, index.row(), index.column(), index.parent())

    event.setDropAction(Qt.MoveAction if accepted else Qt.IgnoreAction)
    event.accept()
Sollte die Standardimplementierung eigentlich nicht genau so reagieren?!