如何用Qt拖到桌面?

时间:2014-06-16 04:43:34

标签: c++ qt

Qt 4.x: how to implement drag-and-drop onto the desktop or into a folder?类似但没有延迟数据位。我将所有数据都存储在内存中,并且具有我想要将文件另存为的文件名。但是,以下代码不起作用:

QDrag *drag = new QDrag(this);

QMimeData *mimeData = new QMimeData;
mimeData->setData(QString::fromUtf8("text/uri-list"), QByteArray(filename, utf8_datalen(filename)));
QByteArray data(buffer->data, buffer->current_location);
mimeData->setData("application/octet-stream", data);

drag->setMimeData(mimeData);

Qt::DropAction dropAction = drag->exec(Qt::CopyAction);

当我在应用程序外拖动时,光标会正确更改。然而,在下降后,没有任何反应;没有文件被复制。我做错了什么?

旁注:我想构建一个跨平台的解决方案,但我目前正在测试Windows。

1 个答案:

答案 0 :(得分:1)

据我所知,没有使用临时文件就没有跨平台解决方案。 对于仅限Windows的解决方案,您必须设置适当的MIME数据:

if(mimeType == "FileName")
{
    QString filename;
    // YOUR CODE HERE
    mimeData->setData("FileName", filename.toLatin1());
}

if(mimeType == "FileNameW")
{
    QString filename;
    // YOUR CODE HERE
    mimeData->setData("FileNameW", QByteArray((const char*) (filename.utf16()), DDFileName.size() * 2));
}
if(mimeType == "FileContents")
{
    QByteArray data;
    // YOUR CORE HERE
    mimeData->setData("FileContents", data);
}
if(mimeType == "FileGroupDescriptorW")
{
    QString filename;
    // YOUR CODE HERE
    FILEGROUPDESCRIPTOR desc;
    desc.cItems = 1;
    desc.fgd[0].dwFlags = FD_PROGRESSUI;
    wcscpy_s(desc.fgd[0].cFileName, filename.toStdWString().c_str());
    // make a deep copy here
    mimeData->setData("FileGroupDescriptorW", QByteArray((const char*)&desc,
               sizeof(FILEGROUPDESCRIPTOR)));
}