ドラッグ・ドロップイベントの受け取り
マウスでテキストやファイルなどをドラッグ・ドロップしたとき、それを受け取るようなプログラムを作るときにQDropEnterEventとQDragEnterEventの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
dropEventとdragEnterEvent関数がそれぞれドラッグされた項目がウインドウ内に入った時、ドロップされたときに呼び出されるイベント関数です。
次に実際にデータを受け取る部分を作ります。
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/html | HTMLテキスト |
image/png | PNG画像 |
video/mpeg | mpeg動画 |
上の表のようにスラッシュの前にデータの
このMimeタイプを判別しているのがMimeDataクラスのhasUrlsやhasText関数でそれぞれドロップされた物がURLなのか、テキストなのかを判別します。
もっと具体的なMimeタイプを調べるときはhasFormat関数を用い、
mime->hasFormat("image/*")
のような使い方をします。この例では画像かどうかを判断しています。
以上ドラッグ・ドロップ処理の実装方法でした。では、また!