2016-04-26 86 views
0

我正在編寫一個應用程序,該應用程序顯示QTableView中的文件列表。我已經將QTableView分類到我自己的視圖(fileBrowserTableView)。此表的目的是顯示文件和文件夾的列表。我希望用戶能夠選擇一個單元格(或單元格的選擇)並將其拖動到接受該類型MIME的外部應用程序(即Windows資源管理器或Outlook)。從我的研究看來,我需要重新實現mousePressEvent和mouseMoveEvent。在這些函數中,我可以創建一個QDrag對象,並將QMimeData設置爲與所選文件相關的QList類型。將單元格從QTableView拖動到外部應用程序

有沒有人有這樣做的任何建議或代碼示例?我發現的所有現有示例似乎都集中在刪除小部件之間的行或放入相同的小部件中。目前我對這個小部件的任何drop功能都不感興趣。我急於保存的另一件事是該小部件的所有現有選擇行爲 - 只有當拖動開始時,我才希望發生這種行爲。目前,我最初嘗試重新實現mousePressEvent意味着我已經失去了我的表中的所有選擇行爲。我在桌子上設置了dragEnabled,所以我可以在鼠標下拖動單元格,儘管目前我顯然不能將它們放在任何地方。

在此先感謝。

回答

1

看看QAbstractItemModel::mimeData。如果你在你的模型中重新實現它,你可以很容易地處理拖動。只要你開始拖動,這個函數將被選中的索引調用,而不必在視圖中重新實現它。

剩下要做的就是使用QMimeData向其添加文件列表。

實施例:

QMimeData *MyModel::mimeData(const QModelIndexList &indexes) const { 
    if(indexes.isEmpty()) 
     return Q_NULLPTR; 
    QMimeData *data = new QMimeData(); 
    QList<QUrl> files; 
    foreach(QModelIndex index, indexes) 
     files += QUrl::fromLocalFile(this->getFileName(index)); 
    data->setUrls(files); 
    return data; 
} 
+0

感謝您的反饋。我最終只實現了mouseMoveEvent - 我的錯誤是我在處理QMimeData任務後沒有調用標準的QTableView :: mouseMoveEvent(..)。我的重新實現函數結束看起來像: ' 空隙fileBrowserTableView :: mouseMoveEvent(QMouseEvent *事件) { \t如果(事件 - >按鈕()&Qt的:: LeftButton){ \t \t \t performDrag(); \t} \t QTableView :: mouseMoveEvent(event); } ' performDrag然後處理QMimeData任務,但我更喜歡你的方法,所以會實現,而不是。 –

相關問題