2014-01-22 33 views
6

我有一個QTreeWidget,它只顯示一個根節點和一個子級節點。 我需要允許子節點的重新排序。 他們絕不能重新考慮。QTreeWidget通過拖動重新排序子項目

這是我如何讓項目在QTreeWidget拖動:

ui->levelElements->setSelectionMode(QAbstractItemView::SingleSelection); 
ui->levelElements->setDragEnabled(true); 
ui->levelElements->viewport()->setAcceptDrops(true); 
ui->levelElements->setDropIndicatorShown(true); 
ui->levelElements->setDragDropMode(QAbstractItemView::InternalMove); 

根項目插入這樣的:

pItem = new QTreeWidgetItem(ui->levelElements); 
pItem->setText(0, node.firstChild().nodeValue()); 
pItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDropEnabled); 

當我插入一個孩子到視圖,它是這樣的聲明:

pItem = new QTreeWidgetItem(); 
pItem->setText(0, strFileName); 
pItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled); 
pTreeRoot->addChild(pItem); 

在這一點上,我可以拖動一個子項目和「re-inser t「在子項目列表中。我也可以將它移到根級別 - 我不想要。

我正在使用QT Creator v3,所以QTreeWidget在我的UI定義文件中。

我在這裏錯過了什麼嗎?

+0

也許這將幫助:http://www.qtcentre.org/threads/32354-Qt-ItemIsDropEnabled-ignored-in -dragDropMode-QAbstractItemView-InternalMove – fritzone

回答

4

例如,您可以覆蓋:虛擬無效dropEvent(QDropEvent *事件)

#include <QApplication> 
#include <QTreeWidget> 
#include <QTreeWidgetItem> 
#include <QDropEvent> 

class TreeView: public QTreeWidget 
{ 
public: 
    TreeView() 
    { 
    resize(200, 300); 

    setSelectionMode(QAbstractItemView::SingleSelection); 
    setDragEnabled(true); 
    viewport()->setAcceptDrops(true); 
    setDropIndicatorShown(true); 
    setDragDropMode(QAbstractItemView::InternalMove); 

    QTreeWidgetItem* parentItem = new QTreeWidgetItem(this); 
    parentItem->setText(0, "Test"); 
    parentItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDropEnabled); 

    for(int i = 0; i < 10; ++i) 
    { 
     QTreeWidgetItem* pItem = new QTreeWidgetItem(parentItem); 
     pItem->setText(0, QString("Number %1").arg(i)); 
     pItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled); 
     pItem->addChild(pItem); 
    } 
    } 

private: 
    virtual void dropEvent(QDropEvent * event) 
    { 
    QModelIndex droppedIndex = indexAt(event->pos()); 

    if(!droppedIndex.isValid()) 
     return; 

    QTreeWidget::dropEvent(event); 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    TreeView widget; 
    widget.show(); 

    return a.exec(); 
} 
+0

感謝您的信息。但是,我不知道如何從設計器文件中更改UI的初始化類(請記住,我正在使用Qt Creator)。有沒有解決的辦法 ? – Simon

+0

您可以在Qt Creator中將標準QTreeWidget提升爲TreeView(http://www.youtube.com/watch?v=Yt-YCxgEnyw) – Igor

+1

存在更糟糕的解決方案(解決方法是繼承):installEventFilter用於QTreeView對象並捕獲QDropEvent。 – Igor

相關問題