Wie reagiere ich auf eine interne Drag-and-Drop-Operation mit einem QListWidget?

7

Ich habe eine Qt4-Anwendung (die die PyQt-Bindungen verwendet), die eine QListWidget enthält, die wie folgt initialisiert ist:

%Vor%

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.

    
Chris B. 03.08.2009, 20:26
quelle

6 Antworten

7

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.

    
Trey Stout 06.10.2009, 21:31
quelle
12

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 .

    
Chani 13.11.2012 20:20
quelle
5

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.

    
Cas 01.12.2012 16:04
quelle
1

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.

    
Cătălin Pitiș 05.08.2009 08:20
quelle
1

Ich weiß, dass das alt ist, aber ich konnte meinen Code mit Treys Antwort verwenden und wollte meine Python-Lösung teilen. Dies ist für ein QListWidget innerhalb eines QDialog , nicht eines, das unterklassifiziert ist.

%Vor%     
akehrer 19.09.2012 21:39
quelle
0

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:

%Vor%     
Vince W. 03.10.2017 14:52
quelle

Tags und Links