QTreeWidget 使用拖放在两个项目之间插入
QTreeWidget insert between two items using drag and drop
我有一个 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);
}
现在,当我用项目填充我的树形小部件时,我可以将一个项目拖到另一个项目上,它会作为 child 添加到我拖到的项目上。但是,当我尝试在其他两个项目之间拖动一个项目时,两行之间没有指示符(我认为应该是一条线)。我刚得到不允许的指示符。
我的问题是,如何使用 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);
虽然我的每个 child 根设置如下:
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);
这里好像有两个问题。一个是我的 supportedDropActions()
只支持 MoveAction,这似乎干扰了拖放插入功能,它在周围添加和删除数据。其症状是每次我在基本测试 QTreeWidget class 中的两个条目之间插入数据时,它也会擦除我拖动的对象之前的元素。通过添加 Qt::CopyAction 使我的 supportedDropActions() 看起来像
Qt::DropActions ModelTreeWidget::supportedDropActions() const
{
return (Qt::MoveAction | Qt::CopyAction);
}
修复了条目之间拖放插入每次移动时删除条目的概率。
但是,这并没有解决我在 post.
中提出的实际问题
解决我的实际问题的不是手动设置树根的标志。
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);
这样做解决了我的问题。我仍然不完全确定为什么这会干扰插入操作,但确实如此。
我有一个 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);
}
现在,当我用项目填充我的树形小部件时,我可以将一个项目拖到另一个项目上,它会作为 child 添加到我拖到的项目上。但是,当我尝试在其他两个项目之间拖动一个项目时,两行之间没有指示符(我认为应该是一条线)。我刚得到不允许的指示符。
我的问题是,如何使用 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);
虽然我的每个 child 根设置如下:
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);
这里好像有两个问题。一个是我的 supportedDropActions()
只支持 MoveAction,这似乎干扰了拖放插入功能,它在周围添加和删除数据。其症状是每次我在基本测试 QTreeWidget class 中的两个条目之间插入数据时,它也会擦除我拖动的对象之前的元素。通过添加 Qt::CopyAction 使我的 supportedDropActions() 看起来像
Qt::DropActions ModelTreeWidget::supportedDropActions() const
{
return (Qt::MoveAction | Qt::CopyAction);
}
修复了条目之间拖放插入每次移动时删除条目的概率。 但是,这并没有解决我在 post.
中提出的实际问题解决我的实际问题的不是手动设置树根的标志。
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);
这样做解决了我的问题。我仍然不完全确定为什么这会干扰插入操作,但确实如此。