5

我正在开发一个 Qt 应用程序来存储通过剪贴板的任何内容,以便以后可以恢复它。我的方法是从 中检索QMimeData并将QApplication::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 有两种格式。Text/Plain包含消息本身文本的类型application/x-qt-windows-mime;value="SkypeMessageFragment"和包含一些类似 xml 的数据的类型。Qt 关于 MIME 类型的文档表明它value="..."描述了数据是如何编码的。我是否必须在某些时候编码或解码某些东西才能使我的 QMimeData 的副本有效?

4

1 回答 1

5

对于自定义 MIME 类型,例如application/x-qt-windows-mime;value="SomeValue",实际上是真正的格式名称(在两个引号之间的 SomeValue后面是什么)。value=

复制 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 回答