QMimeData的最大大小(Windows拖放与剪贴板)

时间:2014-05-26 16:00:05

标签: windows qt

我在使用拖放和QClipboard的QMimeData方面遇到了问题。 情形:

  1. 我有一个SVG格式的医学图像(没有文件,只有缓冲区)以及用户以不同文件格式导出图像的不同选项(例如jpg,tiff,png,...)。
  2. 用户可以选择分辨率(页面格式(例如DIN A7-DIN A3)和DPI(最高600 DPI))
  3. 使用子类化QMimeData类和以下MIME标头条目实现拖放/剪贴板:
    1. "应用程序/ x-QT-图像"
    2. " FileContents"
    3. " FileGroupDescriptorW"
    4. "文件名"
    5. " FileNameW"
  4. 这允许拖放到文件系统和其他应用程序(例如Powerpoint)。 该实现仅提供必要的数据(例如,文件系统拖动仅需要头部/数据2-5并且拖动到例如Powerpoint仅需要头部/数据1)。没有使用中间文件。

    以下列方式构建MIME数据类型(mimeData):

    void SCImageWidget::createDragAndDropData(QString mimeType)
    {
        if(mimeType == "application/x-qt-image" && !mimeData->gotImage)
        {
            ...
            QImage img;
            this->renderSvgImage(img, ...)
            mimeData->setImageData(img);
            mimeData->gotImage = true;
            ...
        }
        else if(mimeType == "FileName" && !mimeData->gotFileName)
        {
            QString DDFileName = ... ;
            mimeData->setData("FileName", DDFileName.toLatin1());
            mimeData->gotFileName = true;
        }
        else if(mimeType == "FileNameW" && !mimeData->gotFileNameW)
        {
            QString DDFileName = ... ;
    
            mimeData->setData("FileNameW", QByteArray((const char*) (DDFileName.utf16()), DDFileName.size() * 2));
            mimeData->gotFileNameW = true;
        }
        else if(mimeType == "FileContents" && !mimeData->gotFileContent)
        {
            ...
            QByteArray data;
            QBuffer buffer(&data);
            buffer.open(QIODevice::WriteOnly);
            this->renderSvgImageToDevice(buffer, ...);
            buffer.close();
            mimeData->setData("FileContents", data);
            mimeData->gotFileContent = true;
            ...
        }
        else if(mimeType == "FileGroupDescriptorW" && !mimeData->gotFileDesc)
        {
            QString DDFileName = ...;
            FILEGROUPDESCRIPTOR desc;
            desc.cItems = 1;
            desc.fgd[0].dwFlags = FD_PROGRESSUI;
            wcscpy_s(desc.fgd[0].cFileName, DDFileName.toStdWString().c_str());
            mimeData->setData("FileGroupDescriptorW", QByteArray((const char*)&desc,
                              sizeof(FILEGROUPDESCRIPTOR)));
            mimeData->gotFileDesc = true;
        }
    
        return;
    }
    

    问题:

    1. 将较大的数据条目(> 11 MB)拖放到文件系统不起作用(错误复制数据/文件夹。没有足够的可用空间)但通过剪贴板工作(最多约50 MB的某个点) )。
    2. 图像数据> 200 DPI无法拖动到Powerpoint(即使是小型压缩png)也没有错误。使用剪贴板甚至A3 / 600 DPI tiff都能正常工作。
    3. 问题:对于剪贴板和拖放操作,Windows是否有任何限制(除了典型的剪贴板的1/16 RAM)?我真的找不到关于这个主题的任何好消息。也许任何人都知道Qt中的一些硬编码限制。

      系统信息:开发。平台:Win 7 64 / 32GB RAM,Qt 5.3

      SSCCE真的不可能 - 抱歉。

0 个答案:

没有答案