QTreeWidget通过拖动重新排序子项 [英] QTreeWidget reordering child items by dragging

查看:1032
本文介绍了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是在我的UI定义文件。

解决方案

例如,您可以覆盖:p>

< virtual void dropEvent(QDropEvent * event)

  #include< QApplication> 
#include< QTreeWidget>
#include< QTreeWidgetItem>
#include< QDropEvent>

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


I have a QTreeWidget which displays a single root node and one level of child nodes only. 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 :

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.

Have I missed something here ?

解决方案

For example you can override: 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();
}

这篇关于QTreeWidget通过拖动重新排序子项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆