2012-10-04 17 views
5

Estoy creando una lista ordenable en Qt. El código funciona perfectamente para Downward Scroll pero cuando tengo algunos problemas para obtener el elemento que se puede arrastrar después de desplazar la lista hacia abajo. He añadido un poco de caso de prueba captura de pantalla para una mejor comprensiónQListWidget Arrastrar después de desplazarse hacia abajo por la lista

Screen1 http://imageshack.us/a/img13/2791/56842367.png Screen2 http://imageshack.us/a/img819/8662/87542336.png Screen3 http://imageshack.us/a/img24/761/97993758.png Screen4 http://imageshack.us/a/img825/1172/93877106.png

Bueno este es el código de caso de prueba

#include <QtGui> 

    int main(int argc, char **argv) 
    { 
     QApplication app(argc, argv); 
     QListWidget *listWidget = new QListWidget; 
     for(int i=0;i<100;++i){ 
     listWidget->addItem("SongOne"); 
     listWidget->addItem("SongTwo"); 
     listWidget->addItem("SongThree"); 
     listWidget->addItem("SongFour"); 
     listWidget->addItem("SongFive"); 
     } 
     listWidget->setDragDropMode(QAbstractItemView::InternalMove); 
     listWidget->setDragEnabled(true); 
     listWidget->setAcceptDrops(true); 
     listWidget->setDropIndicatorShown(true); 
     listWidget->viewport()->setAcceptDrops(true); 
     listWidget->setSelectionMode(QAbstractItemView::SingleSelection); 
     listWidget->show(); 
     app.exec(); 
     delete listWidget; 
     return 0; 
    } 

Thankz por tomarse el tiempo para leer mi post. Ayúdame si tienes alguna pista sobre lo que me estoy perdiendo. Creo que me falta establecer algunas propiedades. En el programa principal (no en el código de prueba), intenté reescribir el dragMoveEvent y algunos métodos más, pero sin uso.

el problema aquí no es la función de arrastrar y soltar, sino el QRect que se crea mientras se arrastra y suelta. En la Figura Dos el Qrect se crean pero no en la Figura Cuatro

Respuesta

1

tratar de eliminar las líneas:

listWidget->setDragEnabled(true); 
listWidget->setAcceptDrops(true); 
listWidget->setDropIndicatorShown(true); 
listWidget->viewport()->setAcceptDrops(true); 

Pueden interfer con el sistema "real" arrastrar y soltar. El reordenamiento generalmente se maneja de forma optimizada.

Otra solución podría ser que subclasifique QListWidget y obtenga el índice del elemento en el evento de arrastre y el índice del elemento del otro en el evento de colocación. Entonces sabes qué reordenar y dónde debe colocarse (antes o después del índice del segundo elemento). El resto debería ser fácil, solo takeItem() y insertItem().

Esperanza te ayudaba con estas dos maneras;)

+0

siento Alejandro el problema aquí no es la de arrastrar y soltar, pero el que se crea QRect mientras arrastra y suelta – sobingt

1

En win7, no fue capaz de reproducir el mismo comportamiento. Simplemente funciona (incluso tamaño de pista está ajustado para cumplir su requisito captura de pantalla. :)) Mi código de prueba fue ...

int main(int argc, char **argv) 
{ 
    QApplication app(argc, argv); 
    QListWidget *listWidget = new QListWidget; 
    const char* titles[] = { 
     "SongOne%1", 
     "SongTwo%1", 
     "SongThree%1", 
     "SongFour%1", 
     "SongFive%1", 
    }; 
    for(int i=0;i<100;++i){ 
     QString title = QString(titles[i%5]).arg(i); 
     QListWidgetItem* item = new QListWidgetItem(title); 
     item->setData(Qt::SizeHintRole, QSize(50,100)); 
     listWidget->addItem(item); 
    } 
    listWidget->setDragDropMode(QAbstractItemView::InternalMove); 
    listWidget->setDragEnabled(true); 
    listWidget->setAcceptDrops(true); 
    listWidget->setDropIndicatorShown(true); 
    listWidget->viewport()->setAcceptDrops(true); 
    listWidget->setSelectionMode(QAbstractItemView::SingleSelection); 
    listWidget->show(); 
    app.exec(); 
    delete listWidget; 
    return 0; 
} 
Cuestiones relacionadas