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

Теперь я могу перетащить дочерний элемент и «вставить» его в список дочерних элементов. Я также могу переместить его на корневой уровень — что я не хочу.

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

Я что-то здесь пропустил?

6

Решение

Например, вы можете переопределить: virtual void dropEvent (QDropEvent * event)

#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();
}
5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]