Qt入門(2) ードラッグ&ドロップー
ファイルをドラッグ&ドロップして、ファイルパスを表示するメモ。
■基礎知識
①URIとは?
ファイルをドロップしたとき、アプリケーションにはファイルからtext/uri-listという情報が送られる。
URI=Uniform Resource Identifier
URLの上位概念ということのようだが、ひとまずは同じようなもの。
その内容はローカルファイルだと「file:///home/user/test.txt」のようなテキスト情報。
②情報はリストとして扱う。
uri-listの名前の通り、送られてくるのはURIのリスト。
複数のファイルをまとめて放り込むと、改行で区切られたURIのリストが送られている。
従って、受け入れ先はリストを扱えるオブジェクトである必要がある。
QListクラスがリストを扱うためのクラス。Qlistはその直後に"<>"を付けて、その中に
リストとして扱うデータのクラスを指定できる。
QUrlというURI(URL)形式のデータを扱うクラスが用意されているので、
QList<QUrl> としてURI情報をリストとして扱うようにする。
③ウィジェットにドロップを受け入れるように変更
ウィジェットがドロップを受け入れられるように、プロパティを変更する。
acceptDropsのプロパティにチェックを入れる。
④ウィジェットにdragEnterEventメソッドとdropEventメソッドを追加する。
具体的にはドラッグ&ドロップをしたいときには、ウィジェット内にドラッグしたものが入ってきた
ときのイベントであるdragEnterEventと、ドロップされたときのイベントであるdropEventの2つの
メソッドを作成する必要がある。
また、それぞれのイベントを扱うのに必要なクラスが、QDragEnterEventとQDropEventの2つ。
(1)dragEnterEventメソッドの設定
QDragEnterEventクラスのオブジェクトをeventとして実体化。
event->mimeData()->hasFormat("text/uri-list")でtext/uri-list情報であることを識別。
event->acceptProposedAction()で受け入れ準備完了。
(2) dropEventメソッドの設定
QDropEventクラスのオブジェクトをeventとして実体化。
QList<QUrl> fileList=event->mimeData()->urls();
でリストオブジェクトにURLのリストが入る。
QString filePath = QDir::toNativeSeparators(fileList[0].toLocalFile());
でリストからファイルパスを取り出す。
[参考]
http://web-tan.forum.impressrd.jp/e/2010/03/09/7539
http://palepoli.skr.jp/content/pygtk/101_drag_and_drop.php
http://tueda.wikkii.com/wiki/アプリケーション-ドラッグ%26ドロップ
■基礎知識
①URIとは?
ファイルをドロップしたとき、アプリケーションにはファイルからtext/uri-listという情報が送られる。
URI=Uniform Resource Identifier
URLの上位概念ということのようだが、ひとまずは同じようなもの。
その内容はローカルファイルだと「file:///home/user/test.txt」のようなテキスト情報。
②情報はリストとして扱う。
uri-listの名前の通り、送られてくるのはURIのリスト。
複数のファイルをまとめて放り込むと、改行で区切られたURIのリストが送られている。
従って、受け入れ先はリストを扱えるオブジェクトである必要がある。
QListクラスがリストを扱うためのクラス。Qlistはその直後に"<>"を付けて、その中に
リストとして扱うデータのクラスを指定できる。
QUrlというURI(URL)形式のデータを扱うクラスが用意されているので、
QList<QUrl> としてURI情報をリストとして扱うようにする。
③ウィジェットにドロップを受け入れるように変更
ウィジェットがドロップを受け入れられるように、プロパティを変更する。
acceptDropsのプロパティにチェックを入れる。
④ウィジェットにdragEnterEventメソッドとdropEventメソッドを追加する。
具体的にはドラッグ&ドロップをしたいときには、ウィジェット内にドラッグしたものが入ってきた
ときのイベントであるdragEnterEventと、ドロップされたときのイベントであるdropEventの2つの
メソッドを作成する必要がある。
また、それぞれのイベントを扱うのに必要なクラスが、QDragEnterEventとQDropEventの2つ。
(1)dragEnterEventメソッドの設定
QDragEnterEventクラスのオブジェクトをeventとして実体化。
event->mimeData()->hasFormat("text/uri-list")でtext/uri-list情報であることを識別。
event->acceptProposedAction()で受け入れ準備完了。
(2) dropEventメソッドの設定
QDropEventクラスのオブジェクトをeventとして実体化。
QList<QUrl> fileList=event->mimeData()->urls();
でリストオブジェクトにURLのリストが入る。
QString filePath = QDir::toNativeSeparators(fileList[0].toLocalFile());
でリストからファイルパスを取り出す。
[参考]
http://web-tan.forum.impressrd.jp/e/2010/03/09/7539
http://palepoli.skr.jp/content/pygtk/101_drag_and_drop.php
http://tueda.wikkii.com/wiki/アプリケーション-ドラッグ%26ドロップ