2014-01-22 15 views
6

Ich habe ein QTreeWidget, das nur einen Stammknoten und nur eine Ebene untergeordneter Knoten anzeigt. Ich muss die Neuordnung der untergeordneten Knoten erlauben. Sie dürfen nie wieder re-parented werden.QTreeWidget Neuordnen untergeordneter Objekte durch Ziehen

Dies ist, wie ich das Ziehen von Elementen in der QTreeWidget aktivieren:

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

Das Stammelement wie folgt eingefügt:

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

Als ich ein Kind in die Ansicht einzufügen, ist es wie folgt deklariert:

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

An diesem Punkt kann ich ein Kind Element ziehen und "Re-Inser t "es in der Liste der Kinderartikel. Ich kann es auch auf die Root-Ebene verschieben - was ich nicht will.

Ich verwende QT Creator v3 und so befindet sich das QTreeWidget in meiner UI-Definitionsdatei.

Habe ich hier etwas verpasst?

+0

Vielleicht hilft dies: http://www.qtcentre.org/threads/32354-Qt-ItemIsDropEnabled-ignored-in dragDropMode-QAbstractItemView-InternalMove – fritzone

Antwort

4

Zum Beispiel können Sie außer Kraft setzen: virtual void dropEvent (QDropEvent * Ereignis)

#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

danke für Ihre Informationen. Ich weiß jedoch nicht, wie ich die von der Benutzeroberfläche initialisierte Klasse aus der Designer-Datei ändern kann (beachte, dass ich Qt Creator verwende). Gibt es einen Weg dahin? – Simon

+0

Sie können Standard QTreeWidget zu TreeView in Qt Creator (http://www.youtube.com/watch?v=Yt-YCxgEnyw) fördern – Igor

+1

Existiert hässlichere Lösung (Umgehung der Problemumgehung): installEventFilter für Ihr QTreeView-Objekt und fangen Sie dort QDropEvent. – Igor