【qt】QTreeWidget 树形组件

一.什么是树形组件

树形组件,我们可以想象一下我们的文件或者qt左侧的项目。
在这里插入图片描述
对对对,就类似于这样!
还是老样子,我们跟着项目来
上图:
在这里插入图片描述
来吧,开干!

二.界面设计树形组件

在这里插入图片描述
可以双击直接添加树形内容:
在这里插入图片描述
还可以添加子目录
在这里插入图片描述

三.代码实现

1.清空

先将刚刚我们界面添加的清除干净。

 ui->treeWidget->clear();

2.设置列数

设置目录有几列

ui->treeWidget->setColumnCount(2);

3.设置头标签

ui->treeWidget->setHeaderLabels(QStringList("科目","描述"));

运行结果:
在这里插入图片描述

4.添加根目录

①QTreeWidgetitem

注意初始化就是treeWidget

QTreeWidgetItem * root1=new QTreeWidgetItem(ui->treeWidget);

②设置文本

 root1->setText(0,"c语言");    
 root1->setText(1,"开发基础");

运行结果:
在这里插入图片描述

③设置图标

需要素材的可以dd我

    QIcon icon;
    icon.addFile(":/image/file.png");
    root1->setIcon(0,icon);

运行结果:
在这里插入图片描述

④添加为顶层目录

添加为顶层目录,也就是添加成根目录

ui->treeWidget->addTopLevelItem(root1);

5.添加子目录

①初始化为父目录

这里的root1就是我们刚刚添加的根目录

QTreeWidgetItem* item=new QTreeWidgetItem(root1);

②子目录添加到父目录

QStringList list={"指针","程序控制","数据结构","结构体","文件操作"};
    for(int i=0;i<list.count();i++)
    {
        QTreeWidgetItem* item=new QTreeWidgetItem(root1);
        item->setText(0,list[i]);
        item->setText(1,"熟练掌握");
        root1->addChild(item);
    }

现在的运行结果:
在这里插入图片描述

③获取到子目录

要是我们还想要在文件操作的目录下再添加目录可以先获取到文件操作的目录项,再下一层初始化为它。

 auto child=root1->child(4);
    QStringList list2={"读文件","写文件","查找文件","删除文件"};
    for(int i=0;i<list2.count();i++)
    {
        QTreeWidgetItem*item=new QTreeWidgetItem(child);
        item->setText(0,list2[i]);
        item->setText(1,"必须掌握");
        root1->addChild(child);
    }

运行结果:
在这里插入图片描述
我们还可以再添加一个c++的根目录

QTreeWidgetItem * root2=new QTreeWidgetItem(ui->treeWidget);
    root2->setText(0,"c++");
    root2->setText(1,"开发高级");

    icon.addFile(":/image/file.png");
    root2->setIcon(0,icon);

    ui->treeWidget->addTopLevelItem(root2);


    QStringList list3={"类和对象","继承和派生","运算符重载","虚函数","模板"};
    for(int i=0;i<list3.count();i++)
    {
        QTreeWidgetItem* item=new QTreeWidgetItem(root2);
        item->setText(0,list3[i]);
        item->setText(1,"熟练掌握");
        root2->addChild(item);
    }

运行结果:
在这里插入图片描述

四.插入目录

1.获取当前选中目录项

auto item=ui->treeWidget->currentItem();//获取当前选中项

2.子目录插入

只能通过父目录来插入

item->parent()->insertChild(ui->treeWidget->currentIndex().row(),newItem);

3.根目录插入

 QIcon icon;
            icon.addFile(":/image/file.png");
            newItem->setIcon(0,icon);
            ui->treeWidget->insertTopLevelItem(ui->treeWidget->currentIndex().row(),newItem);

4.获取当前索引的行号

ui->treeWidget->currentIndex().row()

5.插入功能

auto item=ui->treeWidget->currentItem();//获取当前选中项
    if(item&&item->isSelected())
    {
        QTreeWidgetItem *newItem=new QTreeWidgetItem();
        newItem->setText(0,"未命名");
        newItem->setText(1,"未命名");

        auto parent=item->parent();//根目录是会返回空的
        if(parent)//子目录
        {
            item->parent()->insertChild(ui->treeWidget->currentIndex().row(),newItem);
        }
        else//根目录
        {
            QIcon icon;
            icon.addFile(":/image/file.png");
            newItem->setIcon(0,icon);
            ui->treeWidget->insertTopLevelItem(ui->treeWidget->currentIndex().row(),newItem);
        }
    }

运行结果:
在这里插入图片描述
但是我们的未命名不能进行编辑,这怎么能行,我们姚来设置属性

newItem->setFlags(Qt::ItemIsEditable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);

可以通过F1在线文档来查看需要的标识。

在这里插入图片描述
这就可以编辑了
在这里插入图片描述

五.删除目录

1.设置选择目录形式

现在有个问题,我们只能选择一项,不能像windows的文件一样按ctrl就可以选择多项,但是我们可以设置选择模式
还是可以通过F1在线文档去找,注意有时在父类

ui->treeWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);

现在按住ctrl就可以选择多个
在这里插入图片描述

2.获取当前所有选择的目录

auto items=ui->treeWidget->selectedItems();

3.删除子目录

只能通过父目录来删

int index=parent->indexOfChild(item);
parent->takeChild(index);

4.删除根目录

通过treeWidget来删

int index=ui->treeWidget->indexOfTopLevelItem(item);
ui->treeWidget->takeTopLevelItem(index);

5.删除功能

void MainWindow::on_actionDel_triggered()
{
    auto items=ui->treeWidget->selectedItems();
    for(auto it=items.constBegin();it!=items.end();it++)
    {
        auto item=*it;
        auto parent=item->parent();//根目录是会返回空的
        if(parent)//子目录
        {
            int index=parent->indexOfChild(item);
            parent->takeChild(index);
        }
        else//根目录
        {
            int index=ui->treeWidget->indexOfTopLevelItem(item);
            ui->treeWidget->takeTopLevelItem(index);
        }
    }
}

运行结果:
在这里插入图片描述

六.文本编辑器显示

1.对TreeWidget转到槽

选择这个信号:
在这里插入图片描述

2.功能实现

void MainWindow::on_treeWidget_itemSelectionChanged()
{
    auto items=ui->treeWidget->selectedItems();//获取所有选择的目录,返回的是列表
    for(auto it=items.constBegin();it!=items.end();it++)
    {
        ui->textEdit->append("已选"+(*it)->text(0)+","+(*it)->text(1));
    }
}

运行结果:
在这里插入图片描述

七.总结一下

QTreeWidget树形组件,类似于文件的样式,主要是注意初始化的时候,添加的是那个目录。

人的一切痛苦,本质上都是对自己无能的愤怒。

  • 25
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值