首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QClipboard的setMimeData无法复制安卓系统的值

QClipboard的setMimeData无法复制安卓系统的值
EN

Stack Overflow用户
提问于 2021-09-14 13:20:24
回答 1查看 49关注 0票数 0

我有一个可以同时在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()

代码语言:javascript
复制
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");
}
EN

回答 1

Stack Overflow用户

发布于 2021-10-19 12:19:40

我找不到上述问题的任何解决方案,所以我提出了一个解决方案。我将uri列表作为具有自定义mime类型的文本传递。所以上面的代码变成了:

代码语言:javascript
复制
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。

仅此而已!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69178588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档