我有一个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);
当我在 View 中插入一个 child 时,它的声明如下:
pItem = new QTreeWidgetItem();
pItem->setText(0, strFileName);
pItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled);
pTreeRoot->addChild(pItem);
此时,我可以拖动一个子项并将其“重新插入”到子项列表中。我也可以将其移到根目录级别,这是我不想要的。
我正在使用QT Creator v3,所以QTreeWidget在我的UI定义文件中。
我在这里错过了什么吗?
最佳答案
例如,您可以重写: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();
}
关于c++ - QTreeWidget通过拖动来对子项重新排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21283934/