我正在开发一个 Qt 应用程序来存储剪贴板中的所有内容,以便稍后可以恢复它。我的方法是检索QMime数据 http://qt-project.org/doc/qt-4.8/qmimedata.html来自QApplication::clipboard()
并将其存储在QList<QMimeData *>
。由于剪贴板中的数据是易失性的,我必须复制返回的 QMimeDataQClipboard::mimeData()
。
QMimeData 没有复制构造函数,所以我想我会像这样复制它:
const QMimeData * clipboardData = _clipboard->mimeData();
QMimeData * mimeCopy = new QMimeData();
foreach(const QString & format, clipboardData->formats())
mimeCopy->setData(format, clipboardData->data(format))
where _clipboard
is the QApplication::clipboard()
.
除了某些特定于应用程序的 MIME 类型之外,这种方法工作得相当好。例如,我注意到当我在 Skype 对话中复制、恢复然后粘贴 Skype 消息时,该消息不再被“引用”。这是否证明我的副本有缺陷?有没有更好、更准确的方法来复制 QMimeData ?
经过一番调试,我发现Skype消息mimedata中有两种格式。
AText/Plain
包含消息本身文本和一个的类型application/x-qt-windows-mime;value="SkypeMessageFragment"
类型,其中包含一些类似 xml 的数据。Qt 有关 MIME 类型的文档 http://qt-project.org/doc/qt-4.8/qmimedata.html#platform-specific-mime-types表明value="..."
描述数据的编码方式。我是否必须在某个时刻对某些内容进行编码或解码才能使我的 QMimeData 副本有效?
对于自定义 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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)