2011-01-04 11 views
9

He dos QListWidget (lista1 y lista2)de arrastrar y soltar entre Qt dos QListWidget

  • list1 debe ser capaz de recibir los artículos en list2
  • list1 debe ser capaz de reorganizarse con una fricción interna y gota
  • list2 debe ser capaz de recibir los artículos en list1

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); 

que tenía que poner la list2 en InternalMove si no el artículo no se retire cuando lo arrastro a la list1.

Y si pongo list1 en InternalMove no puedo dejar de usarlo.

¿Tengo que escribir mi propia función de arrastrar y soltar para hacer eso?

Respuesta

11

Puede extender QListWidget primordial método dragMoveEvent, como a continuación

#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 

Dentro de nuestra aplicación, comprobamos la fuente del evento de arrastre y no aceptamos (permitir) soltando los elementos que vienen de nuestro widget en sí.
Si usa QtDesigner puede usar Promover a ... opción desde el menú contextual al hacer clic con el botón derecho en QListWidget en su formulario. Debes ingresar el nombre de tu nueva clase (MyListWidget en mi ejemplo) y debes ingresar el nombre del nuevo archivo de encabezado, donde se declarará tu clase (puedes copiar y pegar el código anterior en este archivo).