Qt学习笔记(十九):QTreeWidget 的常用方法


在界面上拉一个 Tree Widget 控件和五个按钮控件:

Qt学习笔记(十九):QTreeWidget 的常用方法_第1张图片

widget.cpp 文件如下: 

#include "widget.h"
#include "ui_widget.h"
#include 
#include 
#include 
#include 

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    
    // 双击控件,进行编辑
    connect(ui->treeWidget, &QTreeWidget::itemDoubleClicked, [=](QTreeWidgetItem * item, int column){
        qDebug() << column << item->text(column).toUtf8().data();
        
        // 设置允许编辑
        item->setFlags(item->flags() | Qt::ItemIsEditable);
    });
}

Widget::~Widget()
{
    delete ui;
}

// 添加
void Widget::on_btnAdd_clicked()
{
    // 添加标题头
    ui->treeWidget->setHeaderLabels(QStringList() << "英雄姓名" << "英雄介绍");
//    ui->treeWidget->setColumnWidth(0, 100); // 设置列宽
//    ui->treeWidget->setColumnWidth(1, 300);
    
    QFont font;
    font.setBold(true);
    font.setFamily("宋体");
    font.setPointSize(16);
    ui->treeWidget->header()->setFont(font); // 设置标题的字体
    
    ui->treeWidget->header()->setDefaultAlignment(Qt::AlignCenter); // 设置居中显示
    
    
    // 设置 header 的约束模式:ResizeToContents 表示 header 大小根据内容自动调整;
    // 设置了 ResizeToContents 模式,则前面 setColumnWidth 方法设置的列宽无效;
    ui->treeWidget->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
    // 设置最后一个 header 是否占用所有可用空间;默认值为 false;
    // 如果为 false,当内容不足以完全显示内容时,会自动添加滚动条;
    // 如果为 true,则不会自动添加滚动条;
    ui->treeWidget->header()->setStretchLastSection(false);
    
    // 添加项
    QTreeWidgetItem * liItem  = new QTreeWidgetItem(QStringList() << "力量");
    QTreeWidgetItem * minItem  = new QTreeWidgetItem(QStringList() << "敏捷");
    QTreeWidgetItem * zhiItem  = new QTreeWidgetItem(QStringList() << "智力");
    
    // 添加顶层项目
    ui->treeWidget->addTopLevelItem(liItem);
    ui->treeWidget->addTopLevelItem(minItem);
    ui->treeWidget->addTopLevelItem(zhiItem);

    QStringList heroL1;
    QStringList heroL2;
    QStringList heroM1;
    QStringList heroM2;
    QStringList heroZ1;
    QStringList heroZ2;
    
    heroL1 << "刚被猪" << "前排坦克,能在吸收伤害的同时造成可观的范围输出";
    heroL2 << "船长" << "前排坦克,能肉能输出能控场的全能英雄";

    heroM1 << "月骑" << "中排物理输出,可以使用分裂利刃攻击多个目标";
    heroM2 << "小鱼人" << "前排战士,擅长偷取敌人的属性来增强自身战力";

    heroZ1 << "死灵法师" << "前排法师坦克,魔法抗性较高,拥有治疗技能";
    heroZ2 << "巫医" << "后排辅助法师,可以使用奇特的巫术诅咒敌人与治疗队友";

    // 追加子项目 子项也是 QTreeWidgetItem
    QTreeWidgetItem * li1 = new QTreeWidgetItem(heroL1);
    liItem->addChild(li1);
    
    QTreeWidgetItem * li2 =new QTreeWidgetItem(heroL2);
    liItem->addChild(li2);
    
    QTreeWidgetItem * Min1 =new QTreeWidgetItem(heroM1);
    minItem->addChild(Min1);
    
    QTreeWidgetItem * Min2 =new QTreeWidgetItem(heroM2);
    minItem->addChild(Min2);
    
    QTreeWidgetItem * Zhi1 =new QTreeWidgetItem(heroZ1);
    zhiItem->addChild(Zhi1);
    
    QTreeWidgetItem * Zhi2 =new QTreeWidgetItem(heroZ2);
    zhiItem->addChild(Zhi2);
}

// 插入
void Widget::on_btnInsert_clicked()
{
    qDebug() << ui->treeWidget->header()->count();  // header列的数量
    qDebug() << ui->treeWidget->columnCount();      // 列的数量
    qDebug() << ui->treeWidget->topLevelItemCount();// 顶层 item 的数量
    
    // 新创建一个顶层项
    QTreeWidgetItem *adcItem = new QTreeWidgetItem(QStringList() << "ADC");
    
    // 在所有顶层项的最后插入新创建的顶层项
    ui->treeWidget->insertTopLevelItem(ui->treeWidget->topLevelItemCount(), adcItem);
    
    QStringList adcList1;
    adcList1 << "寒冰射手" << "阿瓦罗萨部族的战母,身具寒冰血脉的艾希,是蛮子的老婆!";
    
    QStringList adcList2;
    adcList2 << "皮城女警" << "皮特沃城的女警花,以惩治犯罪为自己的人生目标!";
    
    // 追加子项
    QTreeWidgetItem *hbItem = new QTreeWidgetItem(adcList1);
    QTreeWidgetItem *njItem = new QTreeWidgetItem(adcList2);
    adcItem->addChild(hbItem);
    adcItem->addChild(njItem);
}

// 删除
void Widget::on_btnDelete_clicked()
{
    // 获取当前选中的项
    QTreeWidgetItem *item = ui->treeWidget->currentItem();
    if (item == NULL)
    {
        QMessageBox::warning(this, "系统提示", "没有选择任何项!");
    }
    else
    {
        qDebug() << item->columnCount();
        qDebug() << item->text(0).toUtf8().data();
        qDebug() << item->text(1).toUtf8().data();
        
        if (QMessageBox::question(this, "系统提示", "确定要删除选中的项吗?") == QMessageBox::Yes)
        {
            // 获取当前选中节点的父对象,如果父对象为 NULL,则说明当前选中节点为顶层节点
            QTreeWidgetItem *parentItem = item->parent();
            if (parentItem == NULL)
            {
                qDebug() << "当前节点为顶层节点";
                
                // 获取当前选中节点的行索引
                QModelIndex index = ui->treeWidget->currentIndex();
                qDebug() << QString::number(index.row());
                
                // 根据索引删除顶层节点
                QTreeWidgetItem *delItem = ui->treeWidget->takeTopLevelItem(index.row());
                ui->treeWidget->removeItemWidget(delItem, index.column());
            }
            else
            {
                // 非顶层节点的删除:使用父节点移除当前子节点
                parentItem->removeChild(item);
            }
        }
    }
}

// 修改
void Widget::on_btnUpdate_clicked()
{
    // 在构造函数中添加双击 item 的事件处理程序了
}

// 查找
void Widget::on_btnFind_clicked()
{
    // 获取当前选中的列
    int column = ui->treeWidget->currentColumn();
    qDebug() << QString::number(column);
    
    // 获取当前选中项的索引
    int row = ui->treeWidget->currentIndex().row();
    column = ui->treeWidget->currentIndex().column();
    qDebug() << QString::number(row) << QString::number(column);
    
    // 获取当前选中项的对象
    QTreeWidgetItem *item = ui->treeWidget->currentItem();
    qDebug() << item->text(column).toUtf8().data();
}

添加数据之后的效果如下:

Qt学习笔记(十九):QTreeWidget 的常用方法_第2张图片

你可能感兴趣的:(Qt学习笔记)