我正在编写一个在QTableView中显示文件列表的应用程序。我已经将QTableView子类化为我自己的视图(fileBrowserTableView)。此表的目的是显示文件和文件夹的列表。我希望用户能够选择一个单元格(或选择的单元格)并将其拖到接受该类型MIME(即Windows资源管理器或Outlook)的外部应用程序中。根据我的研究,我似乎需要重新实现mousePressEvent和mouseMoveEvent。在这些函数中,我可以创建一个 QDrag 对象,并将 QMimeData 设置为与所选文件相关的 QList 类型。
有没有人有任何建议或代码示例来执行此操作?我发现的所有现有示例似乎都专注于在小部件之间或相同的小部件中删除行。我目前对这个小部件上的任何拖放功能都不感兴趣。我渴望保留的另一件事是这个小部件的所有现有选择行为 - 只有当拖动开始时,我才希望这种行为发生。目前,我最初尝试重新实现mousePressEvent意味着我已经失去了表中的所有选择行为。我已经在我的桌子上设置了 dragEnabled,所以我可以在鼠标下方拖动单元格,尽管目前我显然不能将它们放在任何地方。
提前谢谢。
看看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;
}