ListViewにファイルをドラッグ&ドロップできるようにしてみる。ListViewにファイルをドラッグ&ドロップするとそのファイルのフルパスがListViewに追加されるようなプログラムを作ってみた。

QListViewを継承したListViewってクラスを用意する。dragEnterEvent()、dragMoveEvent()、dropEvent()メソッドをオーバーライトして処理を実装する。

次のような感じ(プロジェクトをまとめたのを後に貼っとく)

ListView.h

#ifndef LISTVIEW_H
#define LISTVIEW_H

#include <QListView>
#include <QDragEnterEvent>
#include <QDragMoveEvent>
#include <QDropEvent>

class ListView : public QListView
{
    Q_OBJECT
public:
    explicit ListView(QWidget *parent = nullptr);
    virtual ~ListView();

protected:
    void dragEnterEvent(QDragEnterEvent *event) override;
    void dragMoveEvent(QDragMoveEvent *event) override;
    void dropEvent(QDropEvent *event) override;
};

#endif // LISTVIEW_H

ListView.cpp

ListView::ListView(QWidget *parent) : QListView(parent)
{
    // リスト内のドラッグを無効化する。(外からのドラッグのみ受け付けるようにする)
    setDragEnabled(false);
    // ドロップを受け付けるようにする。
    setAcceptDrops(true);
    // ドロップインジケーターを表示するようにする。
    setDropIndicatorShown(true);

    // 用意されているモデルを設定する。
    setModel(new QStandardItemModel());
}

ListView::~ListView()
{
    auto m = model();
    if(m) {
        delete m;
    }
    setModel(nullptr);
}

void ListView::dragEnterEvent(QDragEnterEvent *event)
{
    if(event->mimeData()->hasUrls()) {  // ドラッグされたのがURLなら
        // 受け取れると返す
        event->accept();
    }
}

void ListView::dragMoveEvent(QDragMoveEvent *event)
{
    if(event->mimeData()->hasUrls()) {
        event->accept();
    }
}

void ListView::dropEvent(QDropEvent *event)
{
    if(event->mimeData()->hasUrls()) {
        QStandardItemModel* model = dynamic_cast<QStandardItemModel*>(this->model());
        if(model) {
            foreach(QUrl url, event->mimeData()->urls()) {
                if(url.isLocalFile()) {     // URLがローカルファイルなら
                    // ローカルファイル名を取得して
                    QString filename = url.toLocalFile();
                    // モデルに追加
                    QStandardItem *item = new QStandardItem(filename);
                    model->appendRow(item);
                    // 受け取ったよって返す。
                    event->accept();
                }
            }
        }
    }
}

Qt DesignerにQListViewを貼り付けて、ListViewに格上げしてやる。

ソースの全体はここからダウンロードできる。