2014-01-22 4 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); 

На данный момент я могу перетащить дочерний элемент и «повторно вставить t "в списке дочерних элементов. Я также могу переместить его на корневой уровень, чего я не хочу.

Я использую QT Creator v3, и поэтому QTreeWidget находится в моем файле определения пользовательского интерфейса.

Я что-то пропустил?

+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

Благодарю вас за информацию. Тем не менее, я не знаю, как я могу изменить класс, инициализированный пользовательским интерфейсом, из файла конструктора (помните, что я использую Qt Creator). Есть ли способ обойти это ? – Simon

+0

Вы можете рекламировать стандартный QTreeWidget для TreeView в Qt Creator (http://www.youtube.com/watch?v=Yt-YCxgEnyw) – Igor

+1

Существует более уродливое решение (наследование обходного пути): installEventFilter для вашего объекта QTreeView и поймайте там QDropEvent. – Igor

Смежные вопросы