はいそれでは新しい章「Drag and Drop」をやっていきます。
C++ GUI Programming with Qt4ですと205ページからの章です。
今回はまずメインウィンドウへのドラッグ&ドロップについてやっていきます。
サンプルはC++ GUI Programming with Qt4ですと205ページからのものを少し改変し使用します。
そして、いつものようにQtCreaterの使用を前提とします。(QtCreaterなどの使い方は ”Qtをはじめよう" を見てください。)
ではコードを
(mainwindow.h)
#include <QMainWindow> #include <QDropEvent> #include <QUrl> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT//マクロ public: explicit MainWindow(QWidget *parent = 0);//コンストラクタ ~MainWindow();//デストラクタ void dragEnterEvent(QDragEnterEvent *e);//----ここ重要! void dropEvent(QDropEvent *e);//----ここ重要! private: Ui::MainWindow *ui;//uiにはGUI部品関連の記述 };
(mainwindow.cpp)
#include "mainwindow.h" #include "ui_mainwindow.h" //コンストラクタ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)//uiにはGUI部品に関する記述 { ui->setupUi(this);//uiのGUI部品初期化 //重要!ドラックandドロップを受け付ける //ように設定する。(trueで受け付ける) setAcceptDrops(true); } MainWindow::~MainWindow()//デストラクタ { delete ui; } void MainWindow::dragEnterEvent(QDragEnterEvent *e) { if(e->mimeData()->hasFormat("text/uri-list")) { //視覚的にドロップを受付られることを //表示し、ドラッグ&ドロップを受け付ける //これがないと受付られない。 e->acceptProposedAction(); } } void MainWindow::dropEvent(QDropEvent *e) { //dragEnterEventの後にくるイベント //ドロップの際の動作を記述する ui->label->setText( e->mimeData()->urls().first().toLocalFile()); }
はい簡単ですね。uiは今回の理解にはあまり関係ないので無視します。
まずヘッダ部で重要なのはdragEnterEvent、dropEventをオーバーライドすることを宣言する部分です。あとは見たまんまです。
次に.cppですがまずコンストラクタでsetAcceptDrops(true);を記述しています。
これはドラック&ドロップを許可するように設定しています。許可する場合は必ず書いてください。
なおsetAcceptDrops(false);を記述するとドラック&ドロップは禁止されます。
(デフォルトでドラック&ドロップ許可のウィジットもあります。これは各ウィジット、リファレンスで確認してください。)
次にdragEnterEventの実装ですが引数のeにドラック&ドロップされたファイルの情報が格納されます。そこからMIMEデータを取り出しそのタイプをhasFormatでチェックしています。
今回はtext/uri-listであるかどうかをチェックし、そうならばe->acceptProposedAction();を記述しドラック&ドロップを許可するようにしています。
(QDragEnterEventリファレンス)(QMimeDataリファレンス)
次にdropEventですが、これはdragEnterEventでドラック&ドロップを許可された場合に呼び出されます。これも引数のeにドラック&ドロップされたファイルの情報が格納されますのでそこからMIMEデータを取り出して、そのファイルパスをQLabelに表示しています。
(QDropEventリファレンス)(QMimeDataリファレンス)
※なお正式なMIMEリストはこちら(英語)です。
これらを実行すると以下のようになります。(画像はファイルシステム直下のvmlinuzファイルをドラック&ドロップしたところ。)
以上です。