如何防止特定的QTreeView分支被拖动?

时间:2018-08-23 16:10:26

标签: c++ qt drag-and-drop qtreeview

我有一个QTreeView,它表示一对列表为具有两个分支的树数据结构,并且我想启用在分支之间拖动元素。但是,我也想禁止拖动整个分支。  有谁知道Qt是否提供支持来指定可以拖动QTreeView的单个分支和节点?

1 个答案:

答案 0 :(得分:2)

解决方案

使用QStandardItem::setFlags仅在您要使其可拖动的那些项目上设置Qt::ItemIsDragEnabled,例如:

item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled);

有关更多信息,请参见Qt::ItemFlags

示例

下面的示例创建两个项目列表,并允许将这些项目从一个列表拖放到另一个列表,但是列表本身保持固定,即不可拖动:

#include "MainWindow.h"
#include <QStandardItemModel>
#include <QTreeView>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    auto *view = new QTreeView(this);
    auto *model = new QStandardItemModel(this);
    auto *list1 = createItem(tr("List 1"), true);
    auto *list2 = createItem(tr("List 2"), true);
    auto *rootItem = model->invisibleRootItem();

    rootItem->setFlags(rootItem->flags() ^ Qt::ItemIsDropEnabled);

    list1->appendRow(createItem(tr("Item 1"), false));
    list1->appendRow(createItem(tr("Item 2"), false));
    list1->appendRow(createItem(tr("Item 3"), false));

    list2->appendRow(createItem(tr("Item 4"), false));
    list2->appendRow(createItem(tr("Item 5"), false));

    model->appendRow(list1);
    model->appendRow(list2);

    view->setModel(model);
    view->setDragEnabled(true);
    view->setAcceptDrops(true);
    view->setDefaultDropAction(Qt::MoveAction);
    view->expandAll();
    view->setRootIsDecorated(true);

    setCentralWidget(view);
    resize(300, 400);
}

QStandardItem *MainWindow::createItem(const QString &name, bool topLevel)
{
    auto *item = new QStandardItem(name);
    Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable;

    if (topLevel)
        flags |= Qt::ItemIsDropEnabled;
    else
        flags |= Qt::ItemIsDragEnabled;

    item->setFlags(flags);

    return item;
}