首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QAbstractItemModel canDrag

QAbstractItemModel canDrag
EN

Stack Overflow用户
提问于 2021-11-29 09:36:52
回答 1查看 23关注 0票数 0

我有树小部件(QTreeView),并在我的ObjectListWidget中重新实现了QAbstractItemModel。在树中,我有3种类型的对象。我为此重新实现了拖放功能,并且它起作用了。但是我想拒绝树中不同类型对象的拖动选项。我该怎么做呢?我试图在onSelectionChanged上设置dragEnabled(false),但它的工作方式很奇怪(它将我的选择模式更改为MultiSelection)并取消选择项目。

EN

回答 1

Stack Overflow用户

发布于 2021-11-29 10:20:38

这取决于你是如何实现拖放的。

QStandardItemModel

如果您依赖于QStandardItemModel,那么您应该知道这些标志:

代码语言:javascript
复制
Qt::ItemIsDragEnabled
Qt::ItemIsDropEnabled

现在只在需要的地方设置标志,我的意思是不是对所有人都设置,比如:

代码语言:javascript
复制
#include <QStandardItemModel>
#include <QTreeView>

// ...

QStandardItem *createItem(const QString &name)
{
    auto *item = new QStandardItem(name);
    Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable;
    item->setFlags(flags);
    return item;
}

QStandardItem *createContainerItem(const QString &name)
{
    auto *result = createItem(name);
    auto flags = result->flags();

    flags |= Qt::ItemIsDropEnabled;

    result->setFlags(flags);
    return result;
}

QStandardItem *createDraggableItem(const QString &name)
{
    auto *result = createItem(name);
    auto flags = result->flags();

    flags |= Qt::ItemIsDragEnabled;

    result->setFlags(flags);
    return result;
}

void testUsage() {
    QMainWindow(parent)
{
    auto *window = new QWidget();

    auto *list1 = createContainerItem("My Draggable Content");
    list1->appendRow(createDraggableItem("Item 1"));
    list1->appendRow(createDraggableItem("Item 2"));
    list1->appendRow(createDraggableItem("Item 3"));

    auto *list2 = createContainerItem("My Other List");
    list2->appendRow(createItem("Item 4"));
    list2->appendRow(createItem("Item 5"));

    auto *model = new QStandardItemModel(window);
    model->appendRow(list1);
    model->appendRow(list2);
    auto *rootItem = model->invisibleRootItem();
    rootItem->setFlags(rootItem->flags() ^ Qt::ItemIsDropEnabled);

    auto *view = new QTreeView(window);
    view->setModel(model);
    view->setRootIsDecorated(true);
    view->setDragEnabled(true);
    view->setAcceptDrops(true);
    view->setDefaultDropAction(Qt::MoveAction);
    view->expandAll();
    

    window->setCentralWidget(view);
    window->resize(300, 400);
    window->show();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70152464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档