为 QT 程序添加拖放文件到桌面的功能
QT 的例子程序 $(QTDIR)\examples\draganddrop\delayedencoding 宣称实现了这个功能, 其实没有, 根本不工作.
正确的方法如下所示:
#include <QtGui>
class Label : public QLabel
{
protected:
void mouseMoveEvent(QMouseEvent* event)
{
QTemporaryFile file;
if (file.open())
{
QUrl url = QUrl::fromLocalFile(file.fileName());
file.write(text().toUtf8());
file.close();
QMimeData* mimeData = new QMimeData;
mimeData->setUrls(QList<QUrl>() << url);
QDrag* drag = new QDrag(this);
drag->setMimeData(mimeData);
drag->exec(Qt::CopyAction);
}
}
};
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
Label label;
label.setText("foo bar");
label.show();
return app.exec();
}
关键点就是, 先创建一临时文件, 然后把数据写入. 最后
mimeData->setUrls(QList
() << url);
将这个临时文件的路径写入 mimeData, 这样才能真正实现文件的拖放.
修改过的 delayedencoding 例子工程在这里. delayedencoding
现在, 最大的问题也是唯一的问题是,当文件很大的时候, 鼠标一按下去, 就会卡死主线程, 直到文件复制到本地临时目录后,才会恢复正常. 这期间还不能松开鼠标左键, 否则前功尽弃. 目前没找到更好的解决方案.
其他资讯:
Qt 智能指针学习
Count with me: how many smart pointer classes does Qt have?

近期评论