c++ - 复制 QMimeData 对象的正确方法

标签 c++ qt clipboard

我正在开发一个 Qt 应用程序来存储通过剪贴板的任何内容,以便我以后可以恢复它。我的方法是检索 QMimeData来自 QApplication::clipboard()并将其存储在 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 拷贝有效?

最佳答案

对于像 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;
}

关于c++ - 复制 QMimeData 对象的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13762140/

相关文章:

c++ - QGraphicsPixmapItem的Qt更新像素图

c++ - 如何在 QComboBox 上设置不可选择的默认文本?

javascript - 如何将 JavaScript 二维数组复制到剪贴板以将其粘贴到 excel 中?

javascript - 通过 Javascript 将换行符粘贴到剪贴板

C++ 使用 Qt 重命名文件导致 SIGSEGV

java - 在我们的 Java 应用程序中从 Word 粘贴时出现奇怪的字符

c++ - 指向对象的指针的方法不可访问

c++ - 实例化点和名称绑定(bind)

c++ - 对本周大师的理解 #67 : Double or Nothing

c++ - 如何与 USB 扫描仪通信?