在看QT的torrent例程时,发现其有拖拽相关代码,效果却没有 (QTreeWidget),琢磨后总结如下:
1.首先在构造函数里
TorrentView::TorrentView(QWidget *parent)
: QTreeWidget(parent)
{
//#if QT_CONFIG(draganddrop)
setAcceptDrops(true);
//#endif
}
2.添加drop相关事件
protected:
void dragMoveEvent(QDragMoveEvent *event) ;
void dropEvent(QDropEvent *event) ;
void dragEnterEvent(QDragEnterEvent *e);
void dragLeaveEvent ( QDragLeaveEvent * e );
//在dragEnterEvent里添加这个是关键
void TorrentView::dragEnterEvent(QDragEnterEvent *e)
{
if(e->mimeData()->hasFormat("text/uri-list")) //只能打开文本文件
e->acceptProposedAction(); //可以在这个窗口部件上拖放对象
}
void TorrentView::dragLeaveEvent ( QDragLeaveEvent * e )
{
}
void TorrentView::dragMoveEvent(QDragMoveEvent *event)
{
qDebug()<<"dragmove";
// Accept file actions with a '.torrent' extension.
QUrl url(event->mimeData()->text());
if (url.isValid() && url.scheme() == "file"
&& url.path().toLower().endsWith(".torrent"))
event->acceptProposedAction();
}
void TorrentView::dropEvent(QDropEvent *event)
{
// Accept drops if the file has a '.torrent' extension and it
// exists.
qDebug()<<"drop";
//注意这里从本地文件托过去的话,格式为 file:///c:/..,用Path获取的话是 "/C:/..."
//QString fileName = QUrl(event->mimeData()->text()).path();
//用tolocalFile
QString fileName = QUrl(event->mimeData()->text()).toLocalFile();
if (QFile::exists(fileName) && fileName.toLower().endsWith(".torrent"))
emit fileDropped(fileName);
}