2017-11-22 15 views
0

私はクリップボードとの間で選択したファイルをコピー/切り取り/貼り付けることができる簡単なファイルハンドリングウィジェットを持っています。私はこのウィジェットと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

+1

なぜマイナスポイントですか?この質問に何が間違っていますか? –

+1

私はいくつかの最小限のコードを含むように質問を更新しました。 –

答えて

1

私が答えを見つけたようです。バイトオーダーは間違っていました。なぜなら、何らかの理由でエンディアンが少ししかありませんでした(Qtのデフォルトの順序は大きなエンディアンです)。だから、例のコードは、次のようになります。

QByteArray data; 
QDataStream stream(&data, QIODevice::WriteOnly); 
stream.setByteOrder(QDataStream::LittleEndian); 
stream << dropEffect; 

この方法で、他のファイルマネージャは、コピー/カットを使用して相互運用し、私のQtアプリケーションに貼り付けることができます。クリップボードの内容を解読する逆のプロセスは読者に任されている(データをクリップボードにエンコードするために行われた操作を逆にすることは困難ではない)。もちろん、はるかに多くのファイルのコピーや移動/削除を処理する必要もありますが、それは簡単です。

私は間違っていましたが、実際にはバグを探していました... scopchanovに感謝して、最小限のコードを書いてください! :)

+1

:) "\ x02 \ x00 \ x00 \ x00"が正しいバイトオーダーであることを発見しました。しかし、あなたはより速かったです。とにかく、私は今働いてうれしいです。 – scopchanov

関連する問題