2016-04-26 20 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任务,但我更喜欢你的方法,所以会实现,而不是。 –

相关问题