Qt之QTreeWidget

  • 1.常规功能
  • 1.1添加节点
  • 1.2设置文本
  • 1.3添加图标
  • 1.4属性标记
  • 1.5角色数据
  • 2.示例功能实现
  • 2.1定义节点类型
  • 2.2头文件成员变量及函数定义
  • 2.3初始化树控件
  • 2.3.1添加3个根节点
  • 2.3.2定义右键菜单
  • 2.4成员函数实现
  • 2.4.1增加根节点
  • 2.4.2增加子节点
  • 2.4.3右键菜单



QTreeWidget类是创建和管理目录树结构的类,对应资源控件Item Widgets(Item-based)中的Tree Widget。在使用过程中直接拖拽控件到窗口中即可使用。


1.本文主要展示树控件的一些功能,具体功能如下:


(1)QTreeWidget的常规使用,如添加根节点、子节点,设置节点文本、图标、属性标记、角色数据等;


(2)动态添加子节点,本文上限设置成了7级;


(3)右键点击节点添加、删除节点功能;


示例效果如下:

java gettree构造目录树_Qt

1.常规功能

1.1添加节点

参数原型:explicit QTreeWidgetItem(int type = Type);

type表示节点的类型,在构造函数里传递一个类型值后,可以用QTreeWidgetItem::type()返回这个节点的类型值,自定义的节点值必须大于1000。

1.2设置文本

函数原型:void QTreeWidgetItem::setText(int column, const QString &atext);

setText函数需要传递一个列号,作为参数,指定哪个列进行设置。

1.3添加图标

函数原型:void QTreeWidgetItem::setIcon(int column, const QIcon &aicon);

setIcon函数需要传递一个列号,作为参数,指定哪个列进行设置。

1.4属性标记

函数原型:void setFlags(Qt::ItemFlags flags);

setFlags函数设置节点的一些属性标记,是Qt::ItemFlag枚举类型常量的组合。具体如下:

enum ItemFlag 
    {
        NoItemFlags = 0,                 //不设置任何属性
        ItemIsSelectable = 1,            //可以选择
        ItemIsEditable = 2,              //可以编辑
        ItemIsDragEnabled = 4,           //可以拖动
        ItemIsDropEnabled = 8,           //它可以用作放置目标
        ItemIsUserCheckable = 16,        //它可以由用户选中或取消选中
        ItemIsEnabled = 32,              //用户可以与项目交互
        ItemIsAutoTristate = 64,         //用户可以循环通过三个不同的状态
      }

1.5角色数据

函数原型:void setData(int column, int role, const QVariant &value);

setData函数为节点的某一列设置一个角色数据。其中,column是列号,role是角色的值,value是一个QVariant类型的数。role一般取值为Qt::UserRole,也可以自定义,使用QVariant data(int column, int role) const获取数据时role采用一样的角色值即可。

2.示例功能实现

2.1定义节点类型

本文设置了7级节点类型:

enum TreeItemType
    {
        TopItem = 1001,
        SecondItem,
        ThirdItem,
        FourItem,
        FiveItem,
        SixItem,
        SevenItem,
    };

2.2头文件成员变量及函数定义

public:
    //添加顶层节点
    void AddTopItem(QTreeWidget *widget,TreeItemType type,QString text="text",QString iconPath="");

    //添加子节点
    void AddChildItem(QTreeWidgetItem *item,TreeItemType type,QString text="text",QString iconPath="");
private slots:
    void showTreeRightMenu(QPoint point);
private:
    Ui::TreeWidgetDlg *ui;

    QMenu *m_menu;

2.3初始化树控件

2.3.1添加3个根节点

AddTopItem(ui->treeWidget,TopItem,QString::fromLocal8Bit("根节点1"),"../SRC/ico/software/emule.png");
    AddTopItem(ui->treeWidget,TopItem,QString::fromLocal8Bit("根节点2"),"../SRC/ico/software/emule.png");
    AddTopItem(ui->treeWidget,TopItem,QString::fromLocal8Bit("根节点3"),"../SRC/ico/software/emule.png");

2.3.2定义右键菜单

//为treeWidget选择右键用户自定义菜单
    ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
    ui->treeWidget->setStyle(QStyleFactory::create("Windows"));
    //连接树窗口右键信号与用户自定义菜单槽函数,这里的QPoint是树窗口
    //任意坐标位置
    this->connect(ui->treeWidget,SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(showTreeRightMenu(QPoint)));

    m_menu = new QMenu();
    m_menu->addAction(QIcon("../SRC/ico/software/Search_02.png"),QString::fromLocal8Bit("增加子节点"));
    m_menu->addAction(QIcon("../SRC/ico/software/Search_01.png"),QString::fromLocal8Bit("删除子节点"));
    ui->treeWidget->expandAll();

2.4成员函数实现

2.4.1增加根节点

void TreeWidgetDlg::AddTopItem(QTreeWidget *widget, TreeWidgetDlg::TreeItemType type,QString text,QString iconPath)
{
    QTreeWidgetItem *top = new QTreeWidgetItem(type);
    top->setIcon(0,QIcon(iconPath));
    top->setText(0,text);
    top->setText(1,QString::number(type));
    top->setFlags(Qt::ItemIsSelectable |
                  Qt::ItemIsUserCheckable |
                  Qt::ItemIsEnabled |
                  Qt::ItemIsAutoTristate);
    top->setCheckState(0,Qt::Checked);
    top->setData(0,Qt::UserRole,"11");
    widget->addTopLevelItem(top);
}

2.4.2增加子节点

void TreeWidgetDlg::AddChildItem(QTreeWidgetItem *item, TreeWidgetDlg::TreeItemType type,QString text,QString iconPath)
{
    QTreeWidgetItem *child = new QTreeWidgetItem(type);
    child->setIcon(0,QIcon(iconPath));
    child->setText(0,text);
    child->setText(1,QString::number(type));
    child->setFlags(Qt::ItemIsSelectable |
                  Qt::ItemIsUserCheckable |
                  Qt::ItemIsEnabled |
                  Qt::ItemIsAutoTristate);
    child->setCheckState(0,Qt::Checked);
    child->setData(0,Qt::UserRole,"11");
    item->addChild(child);

}

2.4.3右键菜单

void TreeWidgetDlg::showTreeRightMenu(QPoint point)
{
    //根据pos判断鼠标右击位置是树的根节点root,还是孩子节点child,或者都不是
    //鼠标右击的位置是树的节点,则item是对应的节点信息,否则为NULL
   QTreeWidgetItem* item = ui->treeWidget->itemAt(point);//关键
   if(item == nullptr)
       return;

   QAction * action = m_menu->exec(cursor().pos());
   if(action == nullptr)
       return;
   if(action->text() == QString::fromLocal8Bit("增加子节点"))
   {
       //暂设定添加子节点限值
       int type = item->type();
       if(type == SevenItem)
           return;
       type = type + 1;
       QString info="";
       QString ico="";
       switch(type)
       {
       case SecondItem:
           info = "Second";
           ico = "../SRC/ico/software/Toolkit_03.png";
           break;
       case ThirdItem:
           info = "Third";
           ico = "../SRC/ico/software/Toolkit_02.png";
           break;
       case FourItem:
           info = "Four";
           ico = "../SRC/ico/software/winamp_3.ico";
           break;
       case FiveItem:
           info = "Five";
           ico = "../SRC/ico/software/Write_02.png";
           break;
       case SixItem:
           info = "Six";
           ico = "../SRC/ico/software/Write_03.png";
           break;
       case SevenItem:
           info = "Seven";
           ico = "../SRC/ico/software/winamp thunder.ico";
           break;
       default:
           break;
       }
       int count = item->childCount();
       AddChildItem(item,TreeItemType(type),QString::fromLocal8Bit("%1_%2").arg(info).arg(count),ico);
       item->setExpanded(true);
   }
   else if(action->text() == QString::fromLocal8Bit("删除子节点"))
   {
       ui->treeWidget->removeItemWidget(item,0);
       delete item;
   }
}