Bonjour,
J'utilise un treeview et j'aimerais bouger les items avec la souris (drag & drop).
Avez-vous un bout de code? une piste?
a+
Version imprimable
Bonjour,
J'utilise un treeview et j'aimerais bouger les items avec la souris (drag & drop).
Avez-vous un bout de code? une piste?
a+
bein personne ne peut m'aider?
c'est vrai mais je suis en vacances (sur la fin sniff) c'est pour ca :aie:
moi je veux juste bouger les elements de mon treeview mais interdire de creer un noeud la ou c'etait une feuille. C'est fou comme j'ai du mal à comprendre comment tout ca reagit dans Qt. On ne sait pas quelle methode fait quoi et quelles methodes on doit reimplementer pour que le truc marche.
je vais reprendre mon exemple depuis 0 pour essayer de bien comprendre chaque étape. Les 2 liens que tu m'as donné ne me conviennent pas...
as tu regardé la doc?
http://qt.developpez.com/doc/4.4/dnd/
j'ai tout lu ... et c'est difficile de faire un tree qui marche bien.
en plus j'ai l'impression que niveau bug on est loin du sans faute :-(
essaie de cocher "animate" pour le deploy/collapse des noeuds...
et le "auto-expand" ne va plus marcher ....
QTreeView n'implémente pas déjà le drag and drop?
http://qt.developpez.com/doc/4.4/qab...gdropmode-prop
salut!
j'avais pose a peu pres la meme question, j'ai reussi a controller l'item du drag, mais pas encore le lieu du drop, malheureusement!
voila ce que j'ai pour l'instant, si ca peut aider qqn:
voila pour le .h:
et le .cppCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 class dragableQTreeWidget : public QTreeWidget{ public: dragableQTreeWidget( QWidget* parent = 0 ); bool dropMimeData(QTreeWidgetItem *parent, int index, const QMimeData *data, Qt::DropAction action); QMimeData *mimeData(const QList<QTreeWidgetItem *> items) const; protected: void dragEnterEvent(QDragEnterEvent *e) { dragableQTreeWidget *source = qobject_cast<dragableQTreeWidget *>(e->source()); QTreeWidgetItem *item = source->currentItem(); cout << "nombre de colonnes " << item->columnCount() << endl; if(item->columnCount() == 1){//c'est un item parent e->ignore(); } else{//c'est un item que l'on peut dragguer e->accept(); } } void dragMoveEvent(QDragMoveEvent *e) { e->accept(); } void dropEvent(QDropEvent *e){ e->acceptProposedAction(); e->setDropAction(Qt::MoveAction); dragableQTreeWidget *source = qobject_cast<dragableQTreeWidget *>(e->source()); QTreeWidgetItem *item = this->itemAt(e->pos()); if(item->columnCount() == 1){ e->accept(); } else { e->ignore(); } } };
les seuls items que je peux drag et dropper ici sont des qtreewidgetitems avec 3colonnes et ils doivent rester dans la meme categorie (elle-meme un qtreewidgetitem). le drag marche nikel mais pas le drop, mais ca peut te donner une piste.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 dragableQTreeWidget::dragableQTreeWidget( QWidget* parent ) : QTreeWidget( parent ) { setAcceptDrops( true ); setDragEnabled( true ); setDropIndicatorShown(true); } QMimeData *dragableQTreeWidget::mimeData(const QList<QTreeWidgetItem *> items) const { QByteArray ba; QDataStream ds(&ba, QIODevice::WriteOnly); for (int i=0;i<items.size();i++) ds << items.at(i)->text(0); QMimeData *md = new QMimeData; md->setData("foo/bar", ba); return md; } bool dragableQTreeWidget::dropMimeData(QTreeWidgetItem *parent, int index, const QMimeData *data, Qt::DropAction action) { if(parent==NULL) return false; else { QByteArray ba = data->data("foo/bar"); QDataStream ds(&ba, QIODevice::ReadOnly); while (!ds.atEnd()) { QString str; ds >> str; QTreeWidgetItem *newItem = new QTreeWidgetItem(parent); newItem->setText(0, str); newItem->setExpanded(false); newItem->setBackgroundColor(0, QColor(105, 105, 105)); parent->insertChild(0, newItem); } } return true; }
si tu y arrives, je suis preneur :P
bon j'ai reussi :-) (avec beaucoup de retard)
il y a un bug dans Qt aussi puisqu'il ne distingue pas le copy du move avec Qt::InternalMove
il faut reimplementer les fonctions:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 virtual int columnCount ( const QModelIndex & parent = QModelIndex() ) const virtual QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const virtual QModelIndex index ( int row, int column, const QModelIndex & parent = QModelIndex() ) const virtual QModelIndex parent ( const QModelIndex & index ) const virtual int rowCount ( const QModelIndex & parent = QModelIndex() ) const Qt::ItemFlags flags(const QModelIndex &index) const Qt::DropActions supportedDropActions() const QStringList mimeTypes() const QMimeData * mimeData(const QModelIndexList &indexes) const bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) bool insertRows ( int row, int count, const QModelIndex & parent = QModelIndex() ) bool setData ( const QModelIndex & index, const QVariant & value, int role = Qt::EditRole ) bool removeRows ( int row, int count, const QModelIndex & parent = QModelIndex() )
dropMimeData ne recoit jamais d'action copy, juste move.
ce bug n'existe que avec InternalMove.
cependant si on met dragdrop ca marche mais le default est un copy sauf si on appuie sur "pomme" (je suis sur mac) il fera le move.
c'est normalement l'inverse, le default c'est le move, et le copy si on appuie sur alt.
pour le suivi du bug:
http://trolltech.com/developer/task-...2&method=entry
je ne sais pas si c'est mac only... à essayer !
Avec le code du bug tracker sous windows (en 4.4.1 par contre), il n'y a pas de CopyAction qui apprait dans le terminal.
Après je ne sais pas si c'est un bug puisque la doc dit : "only accepts move operations only from itself" . Ca semble indiquer qu'il ne peut pas recevoir de copyAction.
En revanche, il est vrai que quand on fait Ctrl (windows) en même temps que le drag il y a l'icone copie (le petit carré avec un +) qui apparaît. Donc si le fait qu'on ne puisse pas copier n'est pas un bug, ça s'en est un (plus minime par contre).