2012-10-04 9 views
5

Sto creando una lista ordinabile in Qt. Il codice funziona perfettamente bene per lo scorrimento verso il basso, ma quando ho alcuni problemi ottenendo l'elemento trascinabile dopo ho scorrere l'elenco verso il basso. Ho aggiunto un po 'di test case screenshot per una migliore comprensioneQListWidget Trascina dopo aver scovato l'elenco

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

Ebbene questo è il test del codice caso

#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 per aver dedicato del tempo a leggere il mio post. Aiutami se hai qualche suggerimento su quello che sto perdendo. Penso che mi manchi impostare alcune proprietà. Nel programma principale (non nel codice di test), ho provato a riscrivere lo dragMoveEvent e qualche altro metodo, ma non lo uso.

il problema qui non è il trascinamento della selezione ma il QRect creato durante il trascinamento della selezione. Nella Figura Due il Qrect si crea ma non in Figure Four

risposta

1

tenta di rimuovere le righe:

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

Essi possono interferire con il sistema "reale" Drag'n'Drop. Il riordino viene tipicamente gestito in modo ottimizzato.

Un'altra soluzione potrebbe essere che si sottoclasse QListWidget e ottenere l'indice dell'elemento in caso di trascinamento e l'indice di l'altro elemento nel caso in calo. Quindi sai cosa riordinare e dove dovrebbe essere collocato (prima o dopo l'indice del secondo elemento). Il resto dovrebbe essere facile, solo takeItem() e insertItem().

Speranza ti ho aiutato con questi due modi;)

+0

dispiace Alessandro il problema qui non è il drag and drop, ma il QRect che si crea mentre si fa Drag and Drop – sobingt

1

in Win7, non ero in grado di riprodurre lo stesso comportamento. Funziona proprio (anche accenno dimensione è ottimizzato per soddisfare i requisiti schermata. :)) Il mio codice di prova era ...

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