如何将本地文件复制到QClipboard(在Gnome中)?

时间:2015-09-16 15:25:00

标签: qt clipboard gnome

QClipboard提供了几种将内容复制到剪贴板的方法。标准桌面(文本,像素图等)有高级功能,但我无法弄清楚如何实现标准的副本文件操作。谷歌没有帮助。

2 个答案:

答案 0 :(得分:3)

只需将适当的mime类型和本地文件的URL放入剪贴板即可。 Docs reference

QMimeData* mimeData = new QMimeData();
mimeData->setData("text/uri-list", "file:///C:/fileToCopy.txt");
clipboard->setMimeData(mimeData);

您可以使用静态方法QUrl::fromLocalFile来获取mimeData->setData中使用的QUrl实例:

mimeData->setData("text/uri-list", QUrl::fromLocalFile("C:/fileToCopy.txt"));

答案 1 :(得分:2)

好的,我找到了解决问题的方法。问题是gnome(在linux上工作)做了自己的事情。文件不像{N1ghtLight提到的那样以text/uri-list格式存储,而是使用特殊的x-special/gnome-copied-files格式。以下代码完成了它:

//  Get clipboard
QClipboard *cb = QApplication::clipboard();

// Ownership of the new data is transferred to the clipboard.
QMimeData* newMimeData = new QMimeData();

// Copy old mimedata
const QMimeData* oldMimeData = cb->mimeData();
for ( const QString &f : oldMimeData->formats())
    newMimeData->setData(f, oldMimeData->data(f));

// Copy path of file
newMimeData->setText(_file->absolutePath());

// Copy file
newMimeData->setUrls({QUrl::fromLocalFile(_file->absolutePath())});

// Copy file (gnome)
QByteArray gnomeFormat = QByteArray("copy\n").append(QUrl::fromLocalFile(_file->absolutePath()).toEncoded());
newMimeData->setData("x-special/gnome-copied-files", gnomeFormat);

// Set the mimedata
cb->setMimeData(newMimeData);