私はクリップボードとの間で選択したファイルをコピー/切り取り/貼り付けることができる簡単なファイルハンドリングウィジェットを持っています。私はこのウィジェットとWindowsエクスプローラ(おそらくTotal CommanderやFree Commanderなどの他のファイルマネージャー)の間でこれらのコマンドを使用してファイルを交換できるようにしたいと考えています。私はすでに、を使用してファイル名をQList<QUrl>
としてクリップボードに保存して同様に復元できることを発見しました。こうすることで、ファイル名を格納するのと同じ形式を使用しているように見えるので、ウィジェットと上記のファイルマネージャの間でコピー&ペーストすることができます。クリップボードにアイテムをカットする方法(ファイルを貼り付けた後に削除する方法)はわかりません。私は受信者(データを貼り付けるアプリケーション)がカットファイルを削除する責任があると思います。その場合、クリップボードのデータに何らかの形でコード化されていなければならず、ファイルはコピーされずに切り取られている必要があります。この情報は、受信側のアプリケーションで取り出すことができます。これはどうですか?それとも他の方法がありますか?これはWindowsエクスプローラとフリー・コマンダーの間で完全に機能するため、これが可能であることはわかっています。私。ウィンドウエクスプローラでファイルをカットしてFree Commanderに貼り付けると、元のファイルが削除され、その逆もあります。QtアプリケーションとWindowsエクスプローラの間でクリップボードの切り取りと貼り付け
UPDATE:私は5
(コピー)または2
(カット)の値を有することができるMIMEデータ"Preferred DropEffect"
の別の部分もあるが見出さ 。 を値5
または2
の整数に対応する4バイトに設定すると、Windowsエクスプローラがカットまたはコピーを開始したかどうかを区別できます。それがカットされている場合は、コピーするのではなくファイルを移動することができます。それはうまくいく。残念ながら、これはWindowsエクスプローラからQtアプリケーションへの片方の方法でしか動作しません。私はまだ反対の方向が働かない理由をまだ見つけていない。しかし、私のために解読するのは難しい他のMIMEデータもあります。多分、鍵があります。
更新日2: 動作を再現するためのコードはここにあります。プログラムにハードコードされたファイルが存在することを確認してください。プログラムを実行しようとすると、ウィンドウを開いた後、エクスプローラを開き、エクスプローラを開いて任意のフォルダに移動し、Ctrl + Vキーを押します。ファイルのコピーはそのディレクトリに表示されますが、ソースディレクトリからは削除されません。以下のプログラムは定数2を使用しています。これはコピーではなくカットで、元のファイルが消えることを意味します。
#include <QApplication>
#include <QClipboard>
#include <QDataStream>
#include <QMimeData>
#include <QUrl>
#include <QWidget>
int main(int argc, char *argv[])
{
QApplication application(argc, argv);
auto mimeData = new QMimeData;
// store the URL to files which I want to cut
QList<QUrl> urls;
urls.append(QUrl::fromLocalFile("C:/mypath/myfile.txt")); // use your path or make sure this file exist
mimeData->setUrls(urls);
// store drop effect indicating whether I want to cut or copy
int dropEffect = 2; // 2 for cut and 5 for copy
QByteArray data;
QDataStream stream(&data, QIODevice::WriteOnly);
stream << dropEffect;
mimeData->setData("Preferred DropEffect", data);
QApplication::clipboard()->setMimeData(mimeData);
QWidget window;
window.show();
return application.exec();
}
も参照してくださいとhttps://msdn.microsoft.com/en-us/library/windows/desktop/bb776904(v=vs.85).aspx#delete_on_paste
なぜマイナスポイントですか?この質問に何が間違っていますか? –
私はいくつかの最小限のコードを含むように質問を更新しました。 –