2014-02-13 41 views
0

我正在尋找一個乾淨和跨平臺的方式來防止掉落的物品從Qt應用程序Windows文件資源管理器(或其他OS當量)的Qt如何防止掉落項目從申請到Windows文件瀏覽器

下圖顯示了所期望的行爲: enter image description here

我沒有運氣找到在線的例子或黑客一個變通在一起,但似乎這將是一個共同的,足以用例將有一個精心設計和實施的解決方案。

我已經試過,不具備工作:

  • 檢測拖動並殺死它:

    1. 檢測QDragEnterEvent,QDragMoveEvent,QDragLeaveEvent
    2. 比較answerRect ()或pos()的事件添加到窗口或小部件的幾何圖形或窗口小部件來檢測拖動是否已離開應用程序

    這是非常hacky(而不是在他們工作的時刻),我希望你能指向我一個更優雅的解決方案。

(UPDATE - 試圖改變mime類型,但Windows文件瀏覽器仍然接受下降)

  • 更改MIME類型爲自定義類型:

    1. 上一篇:從上圖中的「Widget w/Drag & Drop」是QTreeViewQFileSystemModel模型
    2. 子類的QFileSystemModel並重寫mimeTypes()功能類似下面
    3. 代碼從qDebug()輸出,它看起來像mime類型被正確設定,但Windows文件瀏覽器仍然接受下降:/
QStringList MyFileSystemModel::mimeTypes() const 
{ 
    QStringList customMimeTypes; 
    customMimeTypes << QString("UnicornsAndRainbows/uri-list"); 
    qDebug() << "customMimeTypes: " << customMimeTypes; 
    return customMimeTypes; 
} 

請讓我知道,當你有機會。

謝謝! :)

+2

只需將MIME類型填充到任何自定義字符串。 –

+0

檢查'dropEvent'上的'mimeType'後,我發現我的上面的實現是__not__正確設置'mimeType'。我目前在[4.8拖放文檔](http://qt-project.org/doc/qt-4.8/dnd.html)中有一些代碼可用於我的用例,並且在清理完代碼後會發佈我的代碼。謝謝德米特里! :) – GraehamF

回答

1

德米特里薩佐諾夫給出了正確的答案。我將解釋我如何在下面實現它。德米特里,如果你想要信譽,把它作爲答案而不是評論,所以我可以接受它作爲答案。

根據德米特里的建議,我對問題更新做了什麼錯誤,其實是我不得不修改QTreeView::mouseMoveEvent()QTreeView::dropEvent()來覆蓋QFileSystemModel::mimeTypes()

//--------------------------------------------------------- 
void MyTreeView::mouseMoveEvent(QMouseEvent *event) 
{ 
    if(!(event->buttons() & Qt::LeftButton)) 
    { 
     return; // we only care about left mouse drags at the moment 
    } 

    if((event->pos() - dragStartPosition).manhattanLength() < QApplication::startDragDistance()) 
    { 
     return; // a buffer when calculating waht qualifies as a "drag event" 
    } 

    QDrag *drag = new QDrag(this); 
    QMimeData *mimeData = new QMimeData(); 
    QByteArray data; 
    const QStringList selectedPaths = this->getSelectedPaths(); // custom helper method 

    foreach(QString path, selectedPaths) 
    { 
     data.append(path).append(";"); // using ';' as path deliminator 
    } 
    data.chop(1); 

    //--- this sets the custom MIME Type filter 
    mimeData->setData(CUSTOM_MIMETYPE_STRING, data); 

    drag->setMimeData(mimeData); 

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


//--------------------------------------------------------- 
void MyTreeView::dropEvent(QDropEvent *event) 
{ 
    // ... 

    QList<QByteArray> paths; 

    //--- this filters based on our custom MIME Type 
    paths = event->mimeData()->data(CUSTOM_MIMETYPE_STRING).split(';'); 

    foreach(QByteArray path, paths) 
    { 
     // do something with the file paths 
    } 
} 
+0

還指出,不應使用愚蠢的「Widget Container Moat」,因爲正確的解決方案是使用自定義MIME類型。 – GraehamF

+0

我試過了,但現在我不能在我自己的應用程序中刪除數據,我是否必須在任何地方註冊此自定義mimetype? – wutzebaer