2014-01-22 36 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

相关问题