与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。
答案 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)));
}