我有一个可以同时在iOS和Android上运行的qml应用程序,QClipboard的setMimeData似乎无法复制一个以"com.myapp.filesystem.myclient.wifi“为键的值(复制了一个空值)。
iOS:当我复制一个以"uri-list“为关键字的东西时,它被复制了。当我以"com.myapp.filesystem.myclient.wifi“作为关键字复制时,它被复制了。
Android:当我以"uri-list“作为key进行复制时,它就被复制了。当我复制以"com.myapp.filesystem.myclient.wifi“作为键的东西时,这个键的值是空的(当复制到应用程序的剪贴板中时)。
附注:p->剪贴板是QApplication::clipboard()
void FileSystemGlobals::copyUris(const FileSystemID &fromFileSystemID, const QStringList &uris) {
auto data = mimeData(fromFileSystemID, uris).toMap();
auto mime = new QMimeData();
for (auto i = data.constBegin(); i != data.constEnd(); i++) {
QByteArray bArray = i.value().toByteArray();
QString key = i.key();
mime->setData(key, bArray);
qDebug() << i.key() << i.value().toByteArray();
}
qDebug() << mime->data("com.myapp.filesystem.myclient.wifi");
p->clipboard->setMimeData(mime);
const QMimeData *mime1 = p->clipboard->mimeData();
qDebug() << "mime1" << mime1->data("com.myapp.filesystem.myclient.wifi");
qDebug() << "mime1" << mime1->data("text/plain");
qDebug() << "mime1" << mime1->data("uri-list");
}发布于 2021-10-19 12:19:40
我找不到上述问题的任何解决方案,所以我提出了一个解决方案。我将uri列表作为具有自定义mime类型的文本传递。所以上面的代码变成了:
void FileSystemGlobals::copyUris(const FileSystemID &fromFileSystemID, const QStringList &uris) {
#ifdef Q_OS_ANDROID
if (fileSystem(fromFileSystemID)->ID() == FileSystem::NOT_LOCAL_FILESYSTEM) {
QStringList uriStringList;
// function that joins all uris to one QString
QString text = joinMimeString(uris);
text.prepend(s_androidNonLocalFsMimeType);
p->clipboard->setText(text);
return;
}
#endif
auto data = mimeData(fromFileSystemID, uris).toMap();
auto mime = new QMimeData();
for (auto i = data.constBegin(); i != data.constEnd(); i++) {
mime->setData(i.key(), i.value().toByteArray());
}
p->clipboard->setMimeData(mime);
}}
s_androidNonLocalFsMimeType是一个唯一的字符串,其前缀是为了确保uris来自特定的非本地文件系统。
在我的paste方法中,删除了惟一的字符串,然后将uris字符串拆分成一个QStringList。
仅此而已!
https://stackoverflow.com/questions/69178588
复制相似问题