将单元格从QTableView拖动到外部应用程序

时间:2016-04-26 19:22:44

标签: c++ qt qt5

我正在编写一个显示QTableView中文件列表的应用程序。我已将QTableView子类化为我自己的视图(fileBrowserTableView)。此表的目的是显示文件和文件夹列表。我希望用户能够选择一个单元格(或单元格的选择)并将其拖动到接受该类型的MIME的外部应用程序(即Windows资源管理器或Outlook)。从我的研究看来,我需要重新实现mousePressEvent和mouseMoveEvent。在这些函数中,我可以创建一个QDrag对象,并将QMimeData设置为QList类型,它与所选文件有关。

有没有人有任何建议或代码示例?我发现的所有现有样本似乎都专注于在小部件之间或相同的小部件中删除行。我目前对此小部件的任何删除功能都不感兴趣。我希望保留的另一件事是这个小部件的所有现有选择行为 - 只有当拖动开始时我才想要发生这种行为。目前我最初尝试重新实现mousePressEvent意味着我已经失去了表中的所有选择行为。我已经在我的桌子上设置了dragEnabled,所以我可以在我的鼠标下拖动细胞,虽然目前我显然不能将它们放在任何地方。

提前致谢。

1 个答案:

答案 0 :(得分: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;
}