使用拖放

时间:2015-04-30 19:53:41

标签: c++ qt qtreewidget

我有一个QTreeWidget,我已经设置好了......

ModelTreeWidget::ModelTreeWidget(QWidget *parent):QTreeWidget(parent), mpModelStruct(nullptr), mpModeldragging(nullptr), mpBufferModel(nullptr), mpModelCurrent(nullptr)
{

    setEditTriggers(QAbstractItemView::SelectedClicked | QAbstractItemView::EditKeyPressed);
    setColumnCount(1);
    setSelectionMode(QAbstractItemView::SingleSelection);

    setDragEnabled(true);
    viewport()->setAcceptDrops(true);
    setDropIndicatorShown(true);
    setDragDropMode(QAbstractItemView::DragDrop);
    setDefaultDropAction(Qt::MoveAction);

}

我也覆盖了我的掉落事件,但它非常无害:

void ModelTreeWidget::dropEvent(QDropEvent* event)
{
    QTreeWidget::dropEvent(event);
}

支持的操作是MoveAction:

Qt::DropActions ModelTreeWidget::supportedDropActions() const
{
    return Qt::MoveAction;
}

每个项目都有标志:

Qt::ItemFlags ModelTreeWidget::getTreeItemFlags() const
{
    return (Qt::ItemIsDragEnabled | Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
}

现在,当我使用项目填充我的树窗口小部件时,我可以将一个项目拖到另一个项目上,并将其作为子项添加到我拖动到的项目上。但是,当我尝试在另外两个项目之间拖动项目时,我没有得到两行之间的指标(我认为应该是一条线)。我只是得到了不允许的指标。

我的问题是,如何使用QTreeWidget拖放功能在其他两个项目之间插入项目?

编辑: 我使用以下代码设置了我的树根:

        QTreeWidgetItem* rootId = new QTreeWidgetItem((QTreeWidget*)0, QStringList(currentModel->name));
        QVariant v = qVariantFromValue((void *) currentModel);
        rootId->setData(0, Qt::UserRole, v);
        rootId->setFlags(Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
        insertTopLevelItem(0, rootId);

虽然我的root的每个孩子都设置如下:

            QTreeWidgetItem *item = new QTreeWidgetItem(parent, QStringList(tempModel->name));
            QVariant v = qVariantFromValue((void *) tempModel);
            item->setData(0, Qt::UserRole, v);
            item->setFlags(getTreeItemFlags());
            parent->addChild(item);

1 个答案:

答案 0 :(得分:2)

这里似乎有两个问题。一个是我的supportedDropActions()仅支持MoveAction,这似乎干扰了拖放插入功能,它添加和删除数据。这种情况的症状是,每次我在基本测试QTreeWidget类中的两个条目之间插入数据时,它也会在拖动对象之前擦除元素。通过添加Qt :: CopyAction使我的supportedDropActions()看起来像

Qt::DropActions ModelTreeWidget::supportedDropActions() const
{
    return (Qt::MoveAction | Qt::CopyAction);
}

修复了每次移动条目时删除条目之间拖放插入的问题。 但是,这并没有解决我在这篇文章中提到的实际问题。

修复了我的实际问题并没有手动设置我的树根标志。

        QTreeWidgetItem* rootId = new QTreeWidgetItem((QTreeWidget*)0, QStringList(currentModel->name));
        QVariant v = qVariantFromValue((void *) currentModel);
        rootId->setData(0, Qt::UserRole, v);
//Commented this out        rootId->setFlags(Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
        insertTopLevelItem(0, rootId);

这样做解决了我的问题。我仍然不完全确定为什么会干扰插入操作,但确实如此。