Drag&Drop - MoveAction in TreeView abweisen

Alles rund um die Programmierung mit Qt
Antworten
OscarWild
Beiträge: 54
Registriert: 19. Juni 2006 19:59

Drag&Drop - MoveAction in TreeView abweisen

Beitrag 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
OscarWild
Beiträge: 54
Registriert: 19. Juni 2006 19:59

Beitrag 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?!
Antworten