QListWidget перетаскивает элементы, исчезающие из списка на Symbian - PullRequest
2 голосов
/ 27 декабря 2010

У меня проблемы с реализацией QListWidget с пользовательскими элементами, которые можно переупорядочить, перетаскивая.Проблема в том, что когда я делаю быстрый двойной щелчок (очень короткое перетаскивание) на элементе, элемент иногда исчезает из QListWidget.

Это конструктор для моего виджета:

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

также событие drop:

void ListPopisiDragDrop::dropEvent(QDropEvent *event){

    int startRow=currentIndex().row();

    QListWidget::dropEvent(event);

    int endRow=currentIndex().row();

    //more code...
}

Пользовательские элементы создаются путем реализации функций paint () и sizeHint () из QAbstractItemDelegate.

Когда возникает проблема с исчезновением элементов, dropEvent isn 'Я даже не звонил.

Я действительно не знаю, что происходит, и делаю ли я что-то не так.Любая помощь приветствуется.

Спасибо!

Редактировать: я запускаю приложение на телефоне Symbian S60 5th edition.

Edit2: Если я добавлю эту строку вКонструктор:

setDragDropOverwriteMode(true);

элемент в списке все еще исчезает, но на его месте остается пустая строка.

Edit3: я добавил этот код, чтобы увидеть, что происходит:

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

    QListWidget::event(e);
}

Я также напечатал «drop drop», когда вызывается drop drop.Это дает мне следующий вывод:

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

Как вы можете видеть, после типа события 68, listCount изменяется с 2 на 1 (один элемент исчезает).Я все еще не понимаю, в чем проблема ...

Edit4: у меня такое же поведение, даже когда я не использую пользовательские элементы.Все еще не могу понять, в чем дело.

Edit5: Даже пример из [1] ведет себя так же, когда тестируется на мобильном устройстве.Может ли быть проблема в Qt?Я использую Qt для Symbian Devices версии 4.6.3 ...

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

Ответы [ 2 ]

2 голосов
/ 27 декабря 2010

Я могу подумать о двух причинах такого поведения: сигнал itemDoubleClicked обрабатывается где-то в вашем QListWidget и делает что-то неоправданное, или ваш «дополнительный код» в dropEvent делает что-то плохое, когда источник и пункт назначения совпадают (вы можете проверить, если startRow равен endRow и ничего не делать в этом случае).

Edit:

Эта программа работает для вас:

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

Строки с тремя звездами могут быть удалены. У меня эта программа работает на Windows XP с Qt 4.7.1, скомпилированной с VS2010.

1 голос
/ 08 июня 2015

Была одна и та же проблема на рабочем столе один раз, с SelectionMode, InternalMove и т. Д. Точно так, как показано.Также у меня была своя собственная модель для представления, поэтому я просто заставил ее вернуться таким образом:

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

Хорошо работало со мной.

...