Pregunta

tengo problemas con la implementación de un QListWidget elementos personalizados que se pueden reordenar arrastrando y soltando. El problema es cuando hago un rápido doble clic (muy poco drag & drop) en un elemento, el elemento desaparece veces desde el QListWidget.

Este es el constructor de mi Widget:

ListPopisiDragDrop::ListPopisiDragDrop(QWidget *parent) :
    QListWidget(parent)
{
    setSelectionMode(QAbstractItemView::SingleSelection);
    setDragEnabled(true);
    viewport()->setAcceptDrops(true);
    setDefaultDropAction(Qt::MoveAction);
    setDropIndicatorShown(true);
    setDragDropMode(QAbstractItemView::InternalMove);
}

también el caso de caída:

void ListPopisiDragDrop::dropEvent(QDropEvent *event){

    int startRow=currentIndex().row();

    QListWidget::dropEvent(event);

    int endRow=currentIndex().row();

    //more code...
}
artículos

personalizados están hechos mediante la aplicación de pintura () y sizeHint () funciones de QAbstractItemDelegate.

Cuando el problema con los objetos que desaparecen sucede, el dropEvent ni siquiera se llama.

Realmente no sé lo que está pasando y si estoy haciendo algo mal. Cualquier ayuda es apreciada.

Gracias!

Editar: Estoy ejecutando la aplicación en un teléfono Symbian S60 5ª edición.

Edit2: Si añado esta línea al constructor:

setDragDropOverwriteMode(true);

el elemento de la lista todavía desaparece, pero un vacío estancias fila en su lugar.

Edit3: He añadido el código para ver lo que está sucediendo:

bool ListPopisiDragDrop::event(QEvent *e){
    qDebug()<<"new event, type: "<<e->type()<<", listCount: "<<this->count();

    QListWidget::event(e);
}

También he impreso "evento de colocación" cuando el evento de colocación se llama. Esto me da el siguiente resultado:

...
[Qt Message] new event, type:  12 , listCount:  2 
[Qt Message] new event, type:  12 , listCount:  2 
[Qt Message] new event, type:  68 , listCount:  2 
[Qt Message] DROPEVENT 
[Qt Message] new event, type:  71 , listCount:  2 
[Qt Message] new event, type:  12 , listCount:  2 
[Qt Message] new event, type:  12 , listCount:  2 
[Qt Message] new event, type:  68 , listCount:  2 
[Qt Message] DROPEVENT 
[Qt Message] new event, type:  71 , listCount:  2 
[Qt Message] new event, type:  12 , listCount:  2 
[Qt Message] new event, type:  12 , listCount:  2 
[Qt Message] new event, type:  12 , listCount:  2 
[Qt Message] new event, type:  68 , listCount:  2 
[Qt Message] new event, type:  12 , listCount:  1 
[Qt Message] new event, type:  12 , listCount:  1 
[Qt Message] new event, type:  1 , listCount:  1
...

Como se puede ver, después de evento de tipo 68, el ListCount cambia de 2 a 1 (desaparece un artículo). Todavía no recibo donde el problema es ...

Edit4: Estoy teniendo el mismo comportamiento, incluso cuando no estoy usando los elementos personalizados. Todavía no se puede averiguar lo que está mal.

Edit5: Incluso el ejemplo de [1] tiene el mismo comportamiento cuando se prueba en el dispositivo móvil. ¿Podría la versión Qt ser un problema? Estoy usando Qt para Symbian Dispositivos versión 4.6.3 ...

[1] http://www.java2s.com/Code/Cpp/Qt/QListWidgetdraganddrop.htm

¿Fue útil?

Solución

No puedo pensar en 2 razones para este comportamiento: la señal itemDoubleClicked se maneja en algún lugar de su QListWidget y hace algo unintendet, o su "más código" en dropEvent hace algo malo cuando la fuente y el destino son los mismos (podrías comprobar si startRow es igual a Filafinal y no hacer nada en este caso).

Editar:

¿Funciona este programa para usted:

#include <QApplication>
#include <QListWidget>

int main(int argc, char **argv)
{
    QApplication a(argc, argv);

    QListWidget lw;

    for(int i = 1; i < 10; ++i)
        lw.addItem(new QListWidgetItem(QString("Item %1").arg(i)));
    lw.setDragEnabled(true); // ***
    lw.viewport()->setAcceptDrops(true); // ***
    lw.setDefaultDropAction(Qt::MoveAction); // ***
    lw.setDropIndicatorShown(true); // ***

    lw.setDragDropMode(QAbstractItemView::InternalMove);

    lw.show();

    a.connect(&a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()));
    a.exec();
}

Las líneas con tres estrellas se puede eliminar. Este programa funciona para mí en Windows XP con Qt 4.7.1, compilado con VS2010.

Otros consejos

Had mismo problema en el escritorio una vez, con SelectionMode, etc. InternalMove exactamente como se muestra. También tenía mi propio modelo para la vista, por lo que acabo de regresar de esa manera:

Qt::ItemFlags MyModel::flags(const QModelIndex& index) const
{
    if (index.isValid())
        return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled;

    return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDropEnabled;
}

Ha trabajado bien para mí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top