Ich habe eine Qt4-Anwendung (die die PyQt-Bindungen verwendet), die eine QListWidget
enthält, die wie folgt initialisiert ist:
Ich kann Elemente hinzufügen und dadurch kann ich die Liste durch Ziehen und Ablegen neu anordnen. Aber wie bekomme ich eine Benachrichtigung, wenn die Liste vom Benutzer neu geordnet wird? Ich habe versucht, der Klasse eine dropMimeData(self, index, data, action)
-Methode hinzuzufügen, aber sie wird nie aufgerufen.
Ich musste mich nur damit befassen und es ist ein Schmerz im Arsch, aber hier ist was zu tun:
Sie müssen eventFilter
in Ihrer Unterklasse ListWidget
installieren und dann auf das Ereignis ChildRemoved
achten. Dieses Ereignis behandelt sowohl das Verschieben als auch das Entfernen. Es sollte also funktionieren, um Objekte per Drag-and-Drop innerhalb einer Liste neu anzuordnen.
Ich schreibe mein Qt in C ++, aber hier ist eine Python-Version:
%Vor%Wenn Sie eine andere Klasse mit dieser Liste haben, können Sie die Ereignisfiltermethode dorthin verschieben. Hoffe, das hilft, ich weiß, dass ich einen Tag lang damit kämpfen musste, bevor ich das herausgefunden habe.
Ich habe einen einfacheren Weg. :)
Sie können tatsächlich auf das interne Modell des Listwidgets mit myList->model()
zugreifen - und von dort sind viele Signale verfügbar.
Wenn Sie nur Drag & amp; Drop bevorzugen, stellen Sie eine Verbindung zu layoutChanged
her.
Wenn du Move-Buttons hast (die normalerweise mit remove + add implementiert werden), verbinde dich auch mit rowsInserted
.
Wenn Sie wissen möchten, was sich bewegt hat, ist rowsMoved
möglicherweise besser als layoutChanged
.
Ich fand Trey Stouts Antwort funktionierte, aber ich bekam offensichtlich Ereignisse, als sich die Reihenfolge der Listen nicht geändert hatte. Ich wandte mich an Chani's Antwort , die funktioniert wie erforderlich, aber ohne Code brauchte ich ein wenig Arbeit in Python zu implementieren / p>
Ich dachte, ich würde das Code-Snippet teilen, um zukünftigen Besuchern zu helfen:
%Vor%Dies wird in PySide getestet, aber es gibt keinen Grund, warum es in PyQt nicht funktionieren würde.
Keine Lösung, aber ein paar Ideen:
Sie sollten wahrscheinlich überprüfen, was von der supportedDropActions-Methode zurückgegeben wird. Möglicherweise müssen Sie diese Methode überschreiben, um Qt :: MoveAction oder Qt :: CopyAction einzubeziehen.
Sie haben QListView :: indexesMoved Signal, aber ich bin nicht sicher, ob es ausgegeben wird, wenn Sie QListWidget verwenden. Es lohnt sich zu überprüfen.
Der QListWidget.model()
-Ansatz schien die eleganteste der vorgeschlagenen Lösungen zu sein, funktionierte aber für mich in PyQt5 nicht. Ich weiß nicht warum, aber vielleicht hat sich etwas geändert in Qt5. Der eventFilter
-Ansatz hat funktioniert, aber es gibt noch eine andere Alternative, die es wert ist, überlegt zu werden: QDropEvent zu übersteuern und zu prüfen, ob event.source selbst ist. Siehe den folgenden Code, der eine MVCE mit allen vorgeschlagenen Lösungen ist, die zum Einchecken in PyQt5 codiert sind: