Перетаскивание Qt между двумя QListWidget - PullRequest
11 голосов
/ 04 января 2011

У меня есть два QListWidget (list1 и list2)

  • list1 должен иметь возможность получать предметы от list2
  • list1 должна иметь возможность реорганизации с помощью внутреннего перетаскивания
  • list2 должен иметь возможность получать предметы от list1

list1->setSelectionMode(QAbstractItemView::SingleSelection);
list1->setDragEnabled(true);
list1->setDragDropMode(QAbstractItemView::DragDrop);
list1->viewport()->setAcceptDrops(true);
list1->setDropIndicatorShown(true);

ulist2->setSelectionMode(QAbstractItemView::SingleSelection);
list2->setDragEnabled(true);
list2->setDragDropMode(QAbstractItemView::InternalMove);
list2->viewport()->setAcceptDrops(true);
list2->setDropIndicatorShown(true);

Мне пришлось поставить list2 на InternalMove, в противном случае элемент не удаляется, когда я перетаскиваю его на list1.

И если я поставлю list1 на InternalMove, я больше не смогу уронить его.

Должен ли я написать свою собственную функцию перетаскивания для этого?

1 Ответ

12 голосов
/ 05 января 2011

Вы можете расширить QListWidget переопределение dragMoveEvent метод, как показано ниже

#ifndef MYLISTWIDGET_HPP
#define MYLISTWIDGET_HPP

#include <QListWidget>

class MyListWidget : public QListWidget {

public:
    MyListWidget(QWidget * parent) :
        QListWidget(parent) {}

protected:
    void dragMoveEvent(QDragMoveEvent *e) {
        if (e->source() != this) {
            e->accept();
        } else {
            e->ignore();
        }
    }
};

#endif // MYLISTWIDGET_HPP

Внутри нашей реализации мы проверяем источник события перетаскивания и не принимаем (не разрешаем) отбрасывать элементы, которые исходят из самого нашего виджета.
Если вы используете QtDesigner , вы можете использовать опцию Повышать до ... из контекстного меню, когда вы щелкаете правой кнопкой мыши по QListWidget в вашей форме. Вы должны ввести имя вашего нового класса (MyListWidget в моем примере), и вы должны ввести имя нового файла заголовка, где будет объявлен ваш класс (вы можете скопировать и вставить код выше в этот файл).

...