ドラッグ・ドロップイベントの受け取り

マウスでテキストやファイルなどをドラッグドロップしたとき、それを受け取るようなプログラムを作るときにQDropEnterEventQDragEnterEventの2つのクラスを使います。

しかし、ただ項目を受け取っただけではどのタイプのデータか分からないのでQMimeDataクラスでどのタイプのデータなのかを判断します。

では、外からドラッグしてきたファイルやテキストの種類を判断してラベルに表示し、さらにその内容をエディットテキスト内に表示するプログラムを作ってみます。

QMainWidget_H.h
#ifndef MAIN_WIDGET_H
#define MAIN_WIDGET_H

#include <QtGui>

class MainWidget : public QWidget
{
public:
    MainWidget();

protected:
    void dropEvent(QDropEvent* event);
    void dragEnterEvent(QDragEnterEvent* event);
    
private:
    QLabel* mimeLabel;
    QTextEdit* contentEdit;
};

#endif

dropEventdragEnterEvent関数がそれぞれドラッグされた項目がウインドウ内に入った時、ドロップされたときに呼び出されるイベント関数です。

次に実際にデータを受け取る部分を作ります。

QMainWidget.cpp
#include "MainWidget_H.h"

MainWidget::MainWidget()
{
    setWindowTitle("window");
    setGeometry(200, 200, 200, 300);
    setAcceptDrops(true);
        //ドロップを有効化
    
    mimeLabel = new QLabel("");
    contentEdit = new QTextEdit("");
    
    QBoxLayout* box = new QBoxLayout(QBoxLayout::TopToBottom);
    box->addWidget(mimeLabel);
    box->addWidget(contentEdit);
    setLayout(box);
}

/** ドラッグを感知したら呼ばれる。*/
void MainWidget::dragEnterEvent(QDragEnterEvent* event)
{
    //データの種類を判別する。
    if(event->mimeData()->hasText()){
        mimeLabel->setText("テキスト");
    }else if(event->mimeData()->hasUrls()){
        mimeLabel->setText("URL");
    }else{
        mimeLabel->setText("その他");
    }
    event->acceptProposedAction();
        //アイテムを利用できるようにする。
}

/** アイテムがドロップされたら呼ばれる。*/
void MainWidget::dropEvent(QDropEvent* event)
{
    const QMimeData* mime = event->mimeData();
    
    if(mime->hasUrls()){
        //QUrlに取得した複数URLを1つずつ代入する。
        foreach(QUrl url, event->mimeData()->urls()){
            contentEdit->setText(contentEdit->toPlainText() + url.toString());
        }
        
    }
    event->acceptProposedAction();
}

ドラッグ、ドロップ処理をするためには必ずsetAcceptDrops関数を有効にします。

次にdragEnterEvent関数内でどのデータの種類がドラッグされているかを判別し、QDragEnetrEventクラスのacceptProposedAction関数でドロップ処理を設定します。

最後にdropEvent関数でドロップされたデータを受け取ります。このデータの受け渡しに使われるのがMIMEタイプ情報を持つQMimeDataクラスです。

mimeData関数でQMineDataオブジェクトを取得できます。

ではMIMEタイプとは何かというと画像やテキストなどを区分するためにつけられる名前です。

たとえば以下のようなMIMEタイプがあります。

MIMEタイプ意味
text/plainプレインテキスト
text/htmlHTMLテキスト
image/pngPNG画像
video/mpegmpeg動画

上の表のようにスラッシュの前にデータの大まかな区分、スラッシュのあとに細かい区分が書かれています。また、大まかな区分だけを表したいときは image/* (画像ファイル全般)などと書きます。

このMimeタイプを判別しているのがMimeDataクラスのhasUrlshasText関数でそれぞれドロップされた物がURLなのか、テキストなのかを判別します。

もっと具体的なMimeタイプを調べるときはhasFormat関数を用い、

mime->hasFormat("image/*")

のような使い方をします。この例では画像かどうかを判断しています。

以上ドラッグ・ドロップ処理の実装方法でした。では、また!

関連項目
プライバシーポリシー