Qt Drag & Drop zwischen zwei Qlistwidget
-
15-10-2019 - |
Frage
Ich habe zwei QListWidget (List1 und List2)
list1
sollte in der Lage sein, Artikel von zu empfangenlist2
list1
sollte in der Lage sein, mit einem internen Luftwiderstand neu organisiert zu werdenlist2
sollte in der Lage sein, Artikel von zu empfangenlist1
list1->setSelectionMode(QAbstractItemView::SingleSelection);
list1->setDragEnabled(true);
list1->setDragDropMode(QAbstractItemView::DragDrop);
list1->viewport()->setAcceptDrops(true);
list1->setDropIndicatorShown(true);
ulist2->setSelectionMode(QAbstractItemView::SingleSelection);
list2->setDragEnabled(true);
list2->setDragDropMode(QAbstractItemView::InternalMove);
list2->viewport()->setAcceptDrops(true);
list2->setDropIndicatorShown(true);
Ich musste das setzen list2
an InternalMove
Andernfalls wird der Gegenstand nicht entfernt, wenn ich es in die ziehe list1
.
Und wenn ich setze list1
zu InternalMove
Ich kann nicht mehr darauf fallen.
Muss ich meine eigene Drag & Drop -Funktion schreiben, um das zu tun?
Lösung
Sie können sich ausdehnen QListWidget
überschreiben dragMoveEvent
Methode wie unten
#ifndef MYLISTWIDGET_HPP
#define MYLISTWIDGET_HPP
#include <QListWidget>
class MyListWidget : public QListWidget {
public:
MyListWidget(QWidget * parent) :
QListWidget(parent) {}
protected:
void dragMoveEvent(QDragMoveEvent *e) {
if (e->source() != this) {
e->accept();
} else {
e->ignore();
}
}
};
#endif // MYLISTWIDGET_HPP
In unserer Implementierung überprüfen wir die Quelle des Drag -Ereignisses und akzeptieren (erlauben) Elemente, die von unserem Widget selbst stammen, nicht.
Wenn Sie verwenden QtDesigner Sie können verwenden Befördert zu... Option im Kontextmenü, wenn Sie mit der rechten Maustaste auf die Klicken auf die QListWidget
auf deinem Formular. Sie müssen einen Namen Ihrer neuen Klasse eingeben (MyListWidget
In meinem Beispiel) und Sie müssen einen Namen der neuen Header -Datei eingeben, in der Ihre Klasse deklariert wird (Sie können den obigen Code in diese Datei kopieren und einfügen).