正确的方法来复制QMimeData对象

时间:2012-12-07 11:25:24

标签: c++ qt clipboard

我正在开发一个Qt应用程序来存储通过剪贴板的任何内容,以便我以后可以恢复它。我的方法是从QApplication::clipboard()中检索QMimeData并将其存储在QList<QMimeData *>中。由于剪贴板中的数据是易失性的,我必须复制QClipboard::mimeData()返回的QMimeData。 QMimeData没有复制构造函数,所以我想我会像这样复制它:

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

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

其中_clipboardQApplication::clipboard()

除了某些特定于应用程序的MIME类型之外,它的工作原理相对较好。例如,我注意到当我在Skype会话中复制,恢复然后粘贴Skype消息时,该消息不再被“引用”。这证明我的副本有缺陷吗?是否有更好,更准确的方法来复制QMimeData?

经过一些调试后,我发现Skype消息mimedata中有两种格式。 一个Text/Plain类型,包含消息本身的文本和application/x-qt-windows-mime;value="SkypeMessageFragment"类型,其中包含一些类似xml的数据。 Qt's documentation on MIME types表示value="..."描述了数据的编码方式。我是否必须在某些时候对某些内容进行编码或解码才能使我的QMimeData副本有效?

1 个答案:

答案 0 :(得分:2)

对于application/x-qt-windows-mime;value="SomeValue"等自定义MIME类型,实际格式名称实际上是SomeValuevalue=之后,两个引号之间的内容)。

复制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;
}