[英]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);
}
我也覆蓋了drop事件,但它是無害的:
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);
雖然我的根的每個孩子都按以下步驟進行設置:
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類的兩個條目之間插入數據時,它也將擦除要拖動的對象之前的元素。 通過添加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);
這樣做解決了我的問題。 我仍然不太確定為什么這會干擾插入操作,但確實如此。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.