拖放到 QTreeView 中的 QStandardItemModel 不起作用

Posted

技术标签:

【中文标题】拖放到 QTreeView 中的 QStandardItemModel 不起作用【英文标题】:Drag and drop onto a QStandardItemModel in a QTreeView not working 【发布时间】:2012-05-23 12:58:47 【问题描述】:

我有一个带有 QStandardItemModel 的 QTreeView。我正在尝试启用从外部资源拖放。我已经完成了文档中提到的拖放以及使用项目视图拖放的所有内容,但事情并不正常。当我尝试将文件拖到树视图上时,图标上总是有一个 X 表示 drop 不可用。 (我使用 OS X,我不知道它的图标会是什么样子)。我希望能够放弃某些项目,但在我掌握基础知识之前,我无法编写该功能。

这是我的子类树视图源代码:

MyTreeView::MyTreeView(QWidget *parent) :
    QTreeView(parent)

    setContextMenuPolicy(Qt::CustomContextMenu);
    setAcceptDrops(true);
    setDropIndicatorShown(true);


void MyTreeView::dragEnterEvent(QDragEnterEvent *event)

    event->acceptProposedAction();


void MyTreeView::dropEvent(QDropEvent *event)

    qDebug("I am here");
    event->acceptProposedAction();

这里是子类标准项目模型的来源:

MyStandardItemModel::MyStandardItemModel(QObject *parent) :
    QStandardItemModel(parent)



Qt::DropActions MyStandardItemModel::supportedDropActions() const

    return Qt::CopyAction;


Qt::ItemFlags MyStandardItemModel::flags(const QModelIndex &index) const

    Qt::ItemFlags defaultFlags = QStandardItemModel::flags(index);

    if (index.isValid())
        return Qt::ItemIsDropEnabled | defaultFlags;
    else
        return defaultFlags;


bool MyStandardItemModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent)

    qDebug("I am in the model");

正如我所说,该图标告诉我 drop 不可用,但如果我无论如何都将其删除,树视图中的文本“我在这里”会被打印出来。但是模型视图中的文本“我在模型中”永远不会被打印出来。我不确定我需要做什么才能让模型识别出可用的水滴并更改图标,或者让 dropMimeData 函数调用。感谢您提供任何帮助,因为我一遍又一遍地阅读了文档,但我显然遗漏了一些东西。

【问题讨论】:

你必须在你的MyTreeView::dropEvent()实现中调用QTreeView::dropEvent() 【参考方案1】:

我认为这是因为您还需要重新实现dragMoveEvent(QDragMoveEvent*) 方法。否则,每件物品都会独立地声明他们不能接受掉落。

【讨论】:

以上是关于拖放到 QTreeView 中的 QStandardItemModel 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

QTreeView - 如何判断拖放事件是重新排序还是父母之间的移动?

qt: pyqt: QTreeView 内部拖放几乎可以正常工作...被拖动的项目消失了

如何将图像拖放到容器中,然后根据拖放到容器中的内容更新容器?

将同一元素拖放到 Jquery UI 中的多个拖放区域

将承诺的文件拖放到 Dock 中的应用程序图标上

如何将项目拖放到 react-dnd 中的空白部分?