复制QMimeData对象的正确方式

Proper way to copy a QMimeData object

本文关键字:方式 QMimeData 对象 复制      更新时间:2023-10-16

我正在开发一个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))

其中CCD_ 4是CCD_。

除了一些特定于应用程序的MIME类型之外,这一操作相对较好。例如,我注意到,当我在Skype对话中复制、恢复并粘贴Skype消息时,该消息不再被"引用"。这是否证明我的复印件有缺陷?是否有更好、更准确的方法来复制QMimeData?

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

对于像application/x-qt-windows-mime;value="SomeValue"这样的自定义MIME类型,实际的格式名称实际上是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;
}