Please nominate your Qt Champions for 2021!

implement drag and drop to file browser or desktop?

  • hello

    I want to implement a program (windows only), such that a person can perform drag and drop from my qt program to desktop (or explorer).

    the thing that needs to be dropped is a fake file. i.e. the file exists in memory, when dropping happens, a fake name will be created on the desktop with the data dumped from memory into the file.

    I have found some ideas for QT4, but I tried with Qt5, doesn't really work

    most of the ideas suggest using application/octet-stream as mime type. but if it is the only mime type, qt doesn't allow dropping.

    only when text/uri-list is also included as a mime type, it allows dropping. but it only supports dropping an actual existing file, not a fake file with a piece of data in the memory.

    here are some of my current codes:

    one approach I tried is from here

        QDrag *drag = new QDrag(this);
        QString filename("file:///haha.dat");
        QMimeData *mimeData = new QMimeData;
        QByteArray data;
        mimeData->setData("application/octet-stream", data);

    this doesn't work, no file can be dropped.

    another way is implementing my own QMimeData, but doesn't work either

      list << "application/x-qt-windows-mime;value=\"Shell IDList Array\"";
      list << "application/x-qt-windows-mime;value=\"DragImageBits\"";
      list << "application/x-qt-windows-mime;value=\"DragContext\"";
      list << "application/x-qt-windows-mime;value=\"DragSourceHelperFlags\"";
      list << "application/x-qt-windows-mime;value=\"InShellDragLoop\"";
      list << "text/uri-list";
      list << "application/octet-stream";
      list << "application/x-qt-windows-mime;value=\"FileName\"";
      list << "application/x-qt-windows-mime;value=\"FileContents\"";
      list << "application/x-qt-windows-mime;value=\"FileNameW\"";
      list << "application/x-qt-windows-mime;value=\"FileGroupDescriptorW\"";
    QVariant MyMimeData::retrieveData(const QString &mimetype, QVariant::Type preferredType) const
        qDebug() << "retrieve data" << mimetype << preferredType;
        if (mimetype == "text/uri-list")
            QVariantList urls;
            urls << QUrl::fromUserInput("file:///haha.dat");
            return ( urls);
        return QString("haha");
    bool MyMimeData::hasFormat(const QString &mimetype) const
        for(int i = 0;i<list.size();++i)
            if (list[i] == mimetype)
                return true;
        return false;
    QStringList MyMimeData::formats() const
        return list;

Log in to reply