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に格上げしてやる。
ソースの全体はここからダウンロードできる。
コメント