簡體   English   中英

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);

}

我也覆蓋了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM