• Qt QTreeWidget控件使用方法


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

    1.创建QTreeWidget控件

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

     1 //初始化控件函数
     2 void MainWindow::init()
     3 {
     4     QTreeWidget *newTree = new QTreeWidget(this);    //在当前的类里创建一个树控件
     5     newTree->headerItem()->setText(0,QString());    //设置表头为空
     6     newTree->setGeometry(50,50,400,240);    //设置起始坐标和大小
     7     QStringList hraders;
     8     hraders<<" "<<"类型"<<"时间";
     9     newTree->setHeaderLabels(hraders);        //添加树表的表头
    10     QTreeWidgetItem *item1 = new QTreeWidgetItem(newTree);    //创建第一个父节点
    11     item1->setText(0,"111");                            
    12     item1->setCheckState(0,Qt::Unchecked);        //添加复选框,起始为未勾选
    13     item1->setFlags(Qt::ItemIsSelectable|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled);
    14     //Qt::ItemIsSelectable表示可选的
    15     //Qt::ItemIsUserCheckable项目上是否有复选框
    16     //Qt::ItemIsEnabled 项目上是否没有被禁用(Enabled可用/Disabled禁用)
    17     QTreeWidgetItem *item1_1 = new QTreeWidgetItem(item1);        //添加子节点
    18     item1_1->setText(0,"111_111");
    19     item1_1->setCheckState(0,Qt::Unchecked);
    20     item1_1->setFlags(Qt::ItemIsSelectable|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled);
    21 
    22     QTreeWidgetItem *item1_2 = new QTreeWidgetItem(item1);
    23     item1_2->setText(0,"111_222");
    24     item1_2->setCheckState(0,Qt::Unchecked);
    25     item1_2->setFlags(Qt::ItemIsSelectable|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled);
    26 
    27     QTreeWidgetItem *item1_3 = new QTreeWidgetItem(item1);
    28     item1_3->setText(0,"111_333");
    29     item1_3->setCheckState(0,Qt::Unchecked);
    30     item1_3->setFlags(Qt::ItemIsSelectable|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled);
    31 
    32     QTreeWidgetItem *item2 = new QTreeWidgetItem(newTree);
    33     item2->setText(0,"222");
    34     item2->setCheckState(0,Qt::Unchecked);
    35     item2->setFlags(Qt::ItemIsSelectable|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled);
    36 
    37     QTreeWidgetItem *item2_1 = new QTreeWidgetItem(item2);
    38     item2_1->setText(0,"222_222");
    39     item2_1->setCheckState(0,Qt::Unchecked);
    40     item2_1->setFlags(Qt::ItemIsSelectable|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled);
    41     connect(newTree,SIGNAL(itemClicked(QTreeWidgetItem *, int)),this,SLOT(treeCheck(QTreeWidgetItem *, int)));
    42     //注意:信号一定只声明变量类型,不要加变量名,是否会报错,找不到该信号
    43 }

    2.类中定义的函数

    槽函数:

    1 public slots:
    2     void treeCheck(QTreeWidgetItem *item, int column);

    与itemClicked信号想连接,当有触发信号时,会传递参数,判断操作的是哪个节点。

    1 pubilc:
    2     void PartiallyCheck(QTreeWidgetItem *item);

    3.槽函数的实现

     1 void MainWindow::treeCheck(QTreeWidgetItem *item, int column)
     2 {
     3     if(Qt::Checked == item->checkState(0))        //若被选中
     4     {
     5         int count = item->childCount();            //得到选中的子节点个数
     6         if(count>0)                                //若大于0,说明选中的是父节点,则将全部的子节点选中
     7         {
     8             for (int i = 0;i<count;i++) {        
     9                 item->child(i)->setCheckState(0,Qt::Checked);
    10             }
    11         }
    12         else {                                //否则选中的是子节点
    13             PartiallyCheck(item);            //将节点传到函数中进行其他操作
    14         }
    15     }
    16     else if(Qt::Unchecked == item->checkState(0)){    //没有被选中
    17         int count = item->childCount();
    18         if(count>0)
    19         {
    20             for (int i = 0;i<count;i++) {
    21                 item->child(i)->setCheckState(0,Qt::Unchecked);
    22             }
    23         }
    24         else {
    25             PartiallyCheck(item);
    26         }
    27     }
    28 }
    29 
    30 void MainWindow::PartiallyCheck(QTreeWidgetItem *item)
    31 {
    32     //得到节点的父节点,首先判断是否为空,为空说明是父节点,则直接退出,若不加判断会造成程序异常退出。
    33     QTreeWidgetItem *parent = item->parent();
    34     if(parent==nullptr)
    35         return;
    36     int selectedCount = 0;        //记录被选中的子节点个数
    37     int count = parent->childCount();        //记录子节点个数
    38     for (int i = 0;i<count ;i++) {            //父节点下的所有子节点,记录选中的子节点个数
    39         if(parent->child(i)->checkState(0)==Qt::Checked)
    40             selectedCount++;
    41     }
    42     if(selectedCount<=0)                    //等于0说明没有子节点被选中,则将父节点取消选中
    43         parent->setCheckState(0,Qt::Unchecked);
    44     else if(selectedCount>0&&selectedCount<count)    //若大于0且小于总的子节点数,说明选中了一部分,则将父节点设置为半选中
    45         parent->setCheckState(0,Qt::PartiallyChecked);
    46     else {                                //否则,全选中
    47         parent->setCheckState(0,Qt::Checked);
    48     }
    49 }
  • 相关阅读:
    zabbix邮箱告警配置
    kali linux 开启配置ssh服务
    自主访问控制和强制访问控制
    Eddy's picture
    Connect the Cities--hdoj
    Dark roads--hdoj
    Ice_cream’s world III
    国王的烦恼---nyoj
    Tree
    Jungle Roads --hdoj
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/13724492.html
Copyright © 2020-2023  润新知