存档

文章标签 ‘Drag and Drop’
839 views

为 QT 程序添加拖放文件到桌面的功能

2011年6月11日

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?

技术心得 ,