c++ - Qt QTreeView : Only allow to drop on an existing item

标签 c++ qt qtreeview

我有一个继承自 QTreeView 的自定义模型。我启用了拖放功能,目前可以将一个项目放到树上。但是,您目前可以拖放到现有项目上或项目之间。我想对此进行限制,以便您只能放到现有项目上。

我已将 DragDropOverwriteMode 设置为 true(实际上这是 QTreeView 的默认值)。但是,这并不能阻止您在项目之间放置 - 它只是意味着您也可以放置到现有项目上。

我知道我可以忽略 dropMimeData(我正在重新实现)中的“插入”滴,方法是检查行和列是否有效(滴到现有项目上的行和列设置为 -1,父级设置为当前项目),我正在这样做。但是,我不想得到这些滴。 IE。我希望它能让你总是在上面的项目或下面的项目上放下,而不是在项目之间。

有什么想法吗?

感谢您的任何建议, 吉尔斯

最佳答案

您需要通过在自定义 View 中重新实现 dragEnterEvent 方法来捕获拖动输入事件。 Qt 文档中的示例是:

void Window::dragEnterEvent(QDragEnterEvent *event)
{
    if (event->mimeData()->hasFormat("text/plain"))
        event->acceptProposedAction();
}

在您的情况下,您可能需要将事件中的 x 和 y 位置与最近项目的 x 和 y 位置或类似的东西进行比较,并根据该信息拒绝或接受建议的操作。

来自 QAbstractItemModel::dropMimeData 文档:

It is the responsibility of the view to provide a suitable location for where the data should be inserted.

我的解释是,如果底层模型(例如您的模型)不支持该 View ,则该 View 应拒绝丢弃。

关于c++ - Qt QTreeView : Only allow to drop on an existing item,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6942098/

相关文章:

c++ - 使用 boost.python 从 UTF-8 编码的 char* 返回 python unicode 实例

c++ - fopen 失败时是否需要 fclose?

c++ - 在 c++11 模式下使用 QtConcurrent::run with move only 参数

c++ - 如何从 Objective C 调用我的 Qt/C++ Dylib?

python - QTreeView 与 QFileSystemModel 无法正常工作

c++ - scanf - 程序等待另一个类似的?

c++ - Qt C++ - QList<float**> 类型不允许

python - 添加一个小部件(QProgressbar)作为 QTreeView 中的子项

python - 使用 QTreeView 编辑字典

c++ - 如何摆脱这个 Eclipse 警告?