5

後で復元できるように、クリップボードを通過するものをすべて保存する Qt アプリケーションを開発しています。私のアプローチは、からQMimeDataQApplication::clipboard()を取得し、それを に格納することでしたQList<QMimeData *>。クリップボードのデータは揮発性であるため、 によって返された QMimeData をコピーする必要がありQClipboard::mimeData()ます。QMimeData のコピー コンストラクターがないため、次のようにコピーすると考えました。

const QMimeData * clipboardData = _clipboard->mimeData();
QMimeData * mimeCopy = new QMimeData();

foreach(const QString & format, clipboardData->formats())
    mimeCopy->setData(format, clipboardData->data(format))

はどこ_clipboardですかQApplication::clipboard()

一部のアプリケーション固有の MIME タイプを除いて、これは比較的うまく機能します。たとえば、Skype メッセージをコピーして復元し、Skype の会話に貼り付けると、メッセージが「引用」されていないことに気付きました。これは私のコピーに欠陥があることを証明しますか? QMimeData をコピーするためのより良い、より正確な方法はありますか?

いくつかのデバッグの後、Skype メッセージの mimedata には 2 つの形式があることがわかりました。Text/Plainメッセージ自体のテキストを含む型と、application/x-qt-windows-mime;value="SkypeMessageFragment"いくつかの xml のようなデータを含む型。MIME タイプに関する Qt のドキュメントにvalue="..."は、データのエンコード方法が記載されていることが示されています。QMimeData のコピーを有効にするために、ある時点で何かをエンコードまたはデコードする必要がありますか?

4

1 に答える 1

5

のようなカスタム MIME タイプの場合application/x-qt-windows-mime;value="SomeValue"、実際の形式名はSomeValue( の後ろvalue=、2 つの引用符の間) です。

QMimeData オブジェクトをコピーするより正確な方法は、次のようになります。

QMimeData * copyMimeData(const QMimeData * mimeReference)
{
    QMimeData * mimeCopy = new QMimeData();

    foreach(QString format, mimeReference->formats())
    {
        // Retrieving data
        QByteArray data = mimeReference->data(format);
        // Checking for custom MIME types
        if(format.startsWith("application/x-qt"))
        {
            // Retrieving true format name
            int indexBegin = format.indexOf('"') + 1;
            int indexEnd = format.indexOf('"', indexBegin);
            format = format.mid(indexBegin, indexEnd - indexBegin);
        }
        mimeCopy->setData(format, data);
    }

    return mimeCopy;
}
于 2013-01-02T10:53:44.507 に答える