【问题标题】:QAbstractItemModel canDragQAbstractItemModel 可以拖动
【发布时间】:2022-01-06 04:06:14
【问题描述】:

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

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    这取决于您如何实现拖放。

    QStandardItemModel

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

    Qt::ItemIsDragEnabled
    Qt::ItemIsDropEnabled
    

    现在只需在需要的地方设置标志,我的意思不是全部,例如:

    #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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-20
      • 1970-01-01
      • 2014-03-28
      相关资源
      最近更新 更多