QT QTreeWidget控件使用方法

最终实现的效果:
在这里插入图片描述

1.创建QTreeWidget控件

创建QTreeWidget控件,添加父节点,父节点下添加子节点,通过复选框进行选择。

//初始化控件函数
void MainWindow::init()
{
    QTreeWidget *newTree = new QTreeWidget(this);	//在当前的类里创建一个树控件
    newTree->headerItem()->setText(0,QString());	//设置表头为空
    newTree->setGeometry(50,50,400,240);	//设置起始坐标和大小
    QStringList hraders;
    hraders<<" "<<"类型"<<"时间";
    newTree->setHeaderLabels(hraders);		//添加树表的表头
    QTreeWidgetItem *item1 = new QTreeWidgetItem(newTree);	//创建第一个父节点
    item1->setText(0,"111");							
    item1->setCheckState(0,Qt::Unchecked);		//添加复选框,起始为未勾选
    item1->setFlags(Qt::ItemIsSelectable|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled);
	//Qt::ItemIsSelectable表示可选的
	//Qt::ItemIsUserCheckable项目上是否有复选框
	//Qt::ItemIsEnabled 项目上是否没有被禁用(Enabled可用/Disabled禁用)
    QTreeWidgetItem *item1_1 = new QTreeWidgetItem(item1);		//添加子节点
    item1_1->setText(0,"111_111");
    item1_1->setCheckState(0,Qt::Unchecked);
    item1_1->setFlags(Qt::ItemIsSelectable|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled);

    QTreeWidgetItem *item1_2 = new QTreeWidgetItem(item1);
    item1_2->setText(0,"111_222");
    item1_2->setCheckState(0,Qt::Unchecked);
    item1_2->setFlags(Qt::ItemIsSelectable|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled);

    QTreeWidgetItem *item1_3 = new QTreeWidgetItem(item1);
    item1_3->setText(0,"111_333");
    item1_3->setCheckState(0,Qt::Unchecked);
    item1_3->setFlags(Qt::ItemIsSelectable|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled);

    QTreeWidgetItem *item2 = new QTreeWidgetItem(newTree);
    item2->setText(0,"222");
    item2->setCheckState(0,Qt::Unchecked);
    item2->setFlags(Qt::ItemIsSelectable|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled);

    QTreeWidgetItem *item2_1 = new QTreeWidgetItem(item2);
    item2_1->setText(0,"222_222");
    item2_1->setCheckState(0,Qt::Unchecked);
    item2_1->setFlags(Qt::ItemIsSelectable|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled);
    connect(newTree,SIGNAL(itemClicked(QTreeWidgetItem *, int)),this,SLOT(treeCheck(QTreeWidgetItem *, int)));
    //注意:信号一定只声明变量类型,不要加变量名,是否会报错,找不到该信号
}

2.类中定义的函数

1.槽函数:
public slots:
void treeCheck(QTreeWidgetItem *item, int column);
与itemClicked信号想连接,当有触发信号时,会传递参数,判断操作的是哪个节点。
2.pubile:
void PartiallyCheck(QTreeWidgetItem *item);

3.槽函数的实现

void MainWindow::treeCheck(QTreeWidgetItem *item, int column)
{
    if(Qt::Checked == item->checkState(0))		//若被选中
    {
        int count = item->childCount();			//得到选中的子节点个数
        if(count>0)								//若大于0,说明选中的是父节点,则将全部的子节点选中
        {
            for (int i = 0;i<count;i++) {		
                item->child(i)->setCheckState(0,Qt::Checked);
            }
        }
        else {								//否则选中的是子节点
            PartiallyCheck(item);			//将节点传到函数中进行其他操作
        }
    }
    else if(Qt::Unchecked == item->checkState(0)){	//没有被选中
        int count = item->childCount();
        if(count>0)
        {
            for (int i = 0;i<count;i++) {
                item->child(i)->setCheckState(0,Qt::Unchecked);
            }
        }
        else {
            PartiallyCheck(item);
        }
    }
}

void MainWindow::PartiallyCheck(QTreeWidgetItem *item)
{
	//得到节点的父节点,首先判断是否为空,为空说明是父节点,则直接退出,若不加判断会造成程序异常退出。
    QTreeWidgetItem *parent = item->parent();
    if(parent==nullptr)
        return;
    int selectedCount = 0;		//记录被选中的子节点个数
    int count = parent->childCount();		//记录子节点个数
    for (int i = 0;i<count ;i++) {			//父节点下的所有子节点,记录选中的子节点个数
        if(parent->child(i)->checkState(0)==Qt::Checked)
            selectedCount++;
    }
    if(selectedCount<=0)					//等于0说明没有子节点被选中,则将父节点取消选中
        parent->setCheckState(0,Qt::Unchecked);
    else if(selectedCount>0&&selectedCount<count)	//若大于0且小于总的子节点数,说明选中了一部分,则将父节点设置为半选中
        parent->setCheckState(0,Qt::PartiallyChecked);
    else {								//否则,全选中
        parent->setCheckState(0,Qt::Checked);
    }
}
  • 8
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值