Question

Je ne parviens pas mettre en œuvre un QListWidget avec des articles personnalisés qui peuvent être réorganisés par glisser-déposer. Le problème est quand je fais un double-clic rapide (un drag & drop très court) sur un élément, l'élément disparaît parfois de la QListWidget.

Ceci est le constructeur pour mon Widget:

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

également l'événement drop:

void ListPopisiDragDrop::dropEvent(QDropEvent *event){

    int startRow=currentIndex().row();

    QListWidget::dropEvent(event);

    int endRow=currentIndex().row();

    //more code...
}

Les produits personnalisés sont faits en mettant en œuvre des fonctions de peinture () et sizeHint () de QAbstractItemDelegate.

Lorsque le problème avec des objets qui disparaissent arrive, le dropEvent est même pas appelé.

Je ne sais vraiment pas ce qui se passe et si je fais quelque chose de mal. Toute aide est appréciée.

Merci!

Edit: J'exécute l'application sur un téléphone 5ème édition Symbian S60.

Edit2: Si j'ajoute cette ligne au constructeur:

setDragDropOverwriteMode(true);

l'élément de la liste disparaît encore, mais un séjour de ligne vide à sa place.

Edit3: J'ai ajouté ce code pour voir ce qui se passe:

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

    QListWidget::event(e);
}

Je l'ai également imprimé « événement drop » lorsque l'événement est appelé goutte. Cela me donne le résultat suivant:

...
[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
...

Comme vous pouvez le voir, après le type d'événement 68, le ListCount passe de 2 à 1 (un élément disparaît). Je n'ai toujours pas où le problème est ...

Edit4: Je vais avoir le même comportement, même quand je ne suis pas en utilisant des articles personnalisés. ne peut toujours pas comprendre ce qui ne va pas.

Edit5: Même l'exemple de [1] a le même comportement lorsqu'il est testé sur l'appareil mobile. la version Qt pourrait être un problème? J'utilise Qt pour Symbian Devices Version 4.6.3 ...

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

Était-ce utile?

La solution

Je peux penser à 2 raisons de ce comportement: le signal itemDoubleClicked est traité quelque part dans votre QListWidget et fait quelque chose unintendet, ou votre « plus de code » dans dropEvent ne mauvaise chose lorsque la source et la destination sont les mêmes (vous pouvez vérifier si startRow est égal à endRow et ne rien faire dans ce cas).

Edit:

Est-ce que ce programme de travail pour vous:

#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();
}

Les lignes avec trois étoiles peut être supprimé. Ce programme fonctionne pour moi sur Windows XP avec Qt 4.7.1, compilé avec VS2010.

Autres conseils

même problème avait sur le bureau une fois, avec SelectionMode, InternalMove etc. exactement comme indiqué. Il y avait également mon propre modèle pour la vue, donc je viens de faire ce retour de cette façon:

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

A travaillé très bien avec moi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top