我想将文件放入操作系统剪贴板中。我正在使用Qt6。 Windows 代码可以工作,Unix 代码则失败。文件被复制,保留原始文件。
auto clipboard = QApplication::clipboard();
auto mimeData = new QMimeData();
auto urls = QList<QUrl>();
urls.append(QUrl::fromLocalFile(selectedFilePath));
mimeData->setUrls(urls);
#if defined(Q_OS_MAC) || defined(Q_OS_UNIX) || defined(Q_OS_LINUX)
mimeData->setData("application/x-cut-operation", QByteArray("true"));
#elif defined(Q_OS_WIN)
// 2 for cut and 5 for copy
int dropEffect = 2;
QByteArray dataForClipboard;
QDataStream stream(&dataForClipboard, QIODevice::WriteOnly);
stream.setByteOrder(QDataStream::LittleEndian);
stream << dropEffect;
mimeData->setData("Preferred DropEffect", dataForClipboard);
// Should catch: Q_OS_FREEBSD, Q_OS_NETBSD, Q_OS_OPENBSD, and Q_OS_LINUX
#else
qWarning() << "Cut operation is not supported on this platform.";
#endif
clipboard->setMimeData(mimeData);
另请参阅 Qt 应用程序和 Windows 资源管理器之间的剪切和粘贴剪贴板交换
编辑:
以下代码可在plasma6上启用复制。还是没剪。
// https://stackoverflow.com/questions/32612779/how-to-copy-local-file-to-qclipboard-in-gnome
QByteArray gnomeFormat =
QByteArray("cut\n").append(QUrl::fromLocalFile(selectedFilePath).toEncoded());
mimeData->setData("x-special/gnome-copied-files", gnomeFormat);
据我所知,Linux 没有在应用程序之间复制文件的概念(这是不需要的,因为 shell 只需要复制和粘贴文本,拥有图形文件管理器仅适用于 Windows 傻瓜)。
如果您使用 X11 作为 Linux 的 GUI,那么 Qt 的文档是这样说的:
由于没有标准的方法来复制和粘贴文件 X11 上的应用程序,目前有各种 MIME 类型和约定 在使用中。例如,Nautilus 希望提供的文件带有 x-special/gnome-copied-files MIME 类型,数据以 剪切/复制操作、换行符和文件的 URL。