glisser-déposer Qt entre deux QListWidget
-
15-10-2019 - |
Question
J'ai deux QListWidget (list1 et list2)
-
list1
devrait être en mesure de recevoir des articles delist2
-
list1
devrait pouvoir être réorganisé avec un glisser-déposer interne -
list2
devrait être en mesure de recevoir des articles delist1
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);
Je devais mettre le list2
sur InternalMove
sinon l'article est supprime pas quand je le faire glisser vers le list1
.
Et si je mets à list1
InternalMove
je ne peux pas laisser tomber plus sur elle.
Dois-je écrire mon propre fonction glisser-déposer pour le faire?
La solution
Vous pouvez étendre QListWidget
primordiale dragMoveEvent
procédé comme ci-dessous
#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
Dans notre implémentation nous vérifions la source de l'événement glisser nous n'acceptons pas (autoriser) à déposer les éléments qui viennent de notre widget de lui-même.
Si vous utilisez QtDesigner vous pouvez utiliser Promouvoir à ... dans le menu contextuel lorsque vous cliquez droit sur le QListWidget
sur votre formulaire. Vous devez entrer un nom de votre nouvelle classe (MyListWidget
dans mon exemple) et vous devez entrer un nom de fichier d'en-tête, où votre classe sera déclarée (vous pouvez copier et coller le code ci-dessus dans ce fichier).