質問

私は2つの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.

そして、私が置いたら list1InternalMove もう落とすことはできません。

それを行うには、独自のドラッグアンドドロップ機能を書く必要がありますか?

役に立ちましたか?

解決

拡張できます 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 私の例では)と、クラスが宣言される新しいヘッダーファイルの名前を入力する必要があります(上のコードをコピーしてこのファイルに貼り付けることができます)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top