[英]QTreeWidget reordering child items by dragging
I have a QTreeWidget which displays a single root node and one level of child nodes only. 我有一个QTreeWidget,它只显示一个根节点和一个子节点级别。 I need to permit the re-ordering of the child nodes.
我需要允许重新排序子节点。 They must never be re-parented.
他们绝不能重新成为父母。
This is how I enable the dragging of items in the 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);
The root item is inserted like this : 根项目插入如下:
pItem = new QTreeWidgetItem(ui->levelElements);
pItem->setText(0, node.firstChild().nodeValue());
pItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDropEnabled);
When I insert a child into the view, it is declared like this : 当我将一个子项插入视图时,它被声明为:
pItem = new QTreeWidgetItem();
pItem->setText(0, strFileName);
pItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled);
pTreeRoot->addChild(pItem);
At this point, I am able to drag a child item and "re-insert" it in the list of child items. 此时,我可以拖动子项并在子项列表中“重新插入”它。 I can also move it to the root level - which I do not want.
我也可以把它移到根级别 - 这是我不想要的。
I am using QT Creator v3 and so the QTreeWidget is within my UI definition file. 我正在使用QT Creator v3,所以QTreeWidget在我的UI定义文件中。
Have I missed something here ? 我错过了什么吗?
For example you can override: virtual void dropEvent(QDropEvent * event) 例如,您可以覆盖: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();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.