Qt创建具有复选框的树形控件

在Qt中的树形控件称为QTreeWidget,而控件里的树形节点称为QTreeWidgetItem。

关于QTreeWidget控件和QTreeWidgetItem的更多详细知识点,可以查看Qt的官方帮助文档。


QTreeWidget类:

Qt创建具有复选框的树形控件


QTreeWidgetItem类:

Qt创建具有复选框的树形控件


实现的功能:

  • 创建树形控件,当选中顶层树形节点时,子节点全部选中。

  • 当选中部分子节点时,顶层树形节点处于灰色未全部选中状态。(部分选中状态)

  • 当子节点全部选中,顶层节点变为选中状态。

具体步骤:

1.  新建Qt GUI应用,项目名称自定,基类选择QWidget,选中“创建界面”复选框。

2.  双击“widget.ui”文件,打开Qt界面设计器,拖出一份QTreeWidget控件。

2.  在头文件“widget.h”中添加上相应的头文件

[cpp] view plain copy
  1. #include<QTreeWidgetItem>  

在Widget的类申明中添加如下代码:

[cpp] view plain copy
  1. public//申明初始化函数  
  2.     void init();  
  3.     void updateParentItem(QTreeWidgetItem* item);  
  4.   
  5. public slots:   //申明信号与槽,当树形控件的子选项被改变时执行  
  6.     void treeItemChanged(QTreeWidgetItem* item , int column);  
Qt创建具有复选框的树形控件


4.  在源文件“widget.cpp”中的类Widget构造函数中添加如下代码:

[cpp] view plain copy
  1. init();  
  2. connect(ui->treeWidget,SIGNAL(itemChanged(QTreeWidgetItem*,int)),this,SLOT(treeItemChanged(QTreeWidgetItem*,int)));  

Qt创建具有复选框的树形控件


5.  在源文件“widget.cpp”中实现各个函数:

void Widget::init()

[cpp] view plain copy
  1. void Widget::init()  
  2. {  
  3.     ui->treeWidget->clear();    //初始化树形控件  
  4.   
  5.     //定义第一个树形组  
  6.     QTreeWidgetItem* group1 = new QTreeWidgetItem(ui->treeWidget);  
  7.     group1->setText(0,"group1");    //树形控件显示的文本信息  
  8.     group1->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);   //设置树形控件子项的属性  
  9.     group1->setCheckState(0,Qt::Unchecked); //初始状态没有被选中  
  10.     //第一组子项  
  11.     QTreeWidgetItem* subItem11 = new QTreeWidgetItem(group1);  
  12.     subItem11->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);  
  13.     subItem11->setText(0,"subItem11");  //设置子项显示的文本  
  14.     subItem11->setCheckState(0,Qt::Checked); //设置子选项的显示格式和状态  
  15.   
  16.     QTreeWidgetItem* subItem12 = new QTreeWidgetItem(group1);  
  17.     subItem12->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);  
  18.     subItem12->setText(0,"subItem12");  
  19.     subItem12->setCheckState(0,Qt::Unchecked);  
  20.   
  21.     QTreeWidgetItem* subItem13 = new QTreeWidgetItem(group1);  
  22.     subItem13->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);  
  23.     subItem13->setText(0,"subItem13");  
  24.     subItem13->setCheckState(0,Qt::Unchecked);  
  25.   
  26.     //定义第二个树形组  
  27.     QTreeWidgetItem* group2 = new QTreeWidgetItem(ui->treeWidget);  
  28.     group2->setText(0,"group2");  
  29.     group2->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);  
  30.     group2->setCheckState(0,Qt::Unchecked);  
  31.   
  32.     //第二组子项  
  33.     QTreeWidgetItem* subItem21 = new QTreeWidgetItem(group2);   //指定子项属于哪一个父项  
  34.     subItem21->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);  
  35.     subItem21->setText(0,"subItem21");  
  36.     subItem21->setCheckState(0,Qt::Unchecked);  
  37.   
  38.     QTreeWidgetItem* subItem22 = new QTreeWidgetItem(group2);  
  39.     subItem22->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);  
  40.     subItem22->setText(0,"subItem22");  
  41.     subItem22->setCheckState(0,Qt::Unchecked);  
  42.   
  43.     QTreeWidgetItem* subItem23 = new QTreeWidgetItem(group2);  
  44.     subItem23->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);  
  45.     subItem23->setText(0,"subItem23");  
  46.     subItem23->setCheckState(0,Qt::Unchecked);  
  47. }  


void Widget::treeItemChanged(QTreeWidgetItem* item, int column)

[cpp] view plain copy
  1. void Widget::treeItemChanged(QTreeWidgetItem* item, int column)  
  2. {  
  3.     //QString itemText = item->text(0);  
  4.     if(Qt::Checked == item->checkState(0))  
  5.     {  
  6.        // QTreeWidgetItem* parent = item->parent();  
  7.         int count = item->childCount(); //返回子项的个数  
  8.         if(count >0)  
  9.         {  
  10.             for(int i=0; i<count; i++)  
  11.             {  
  12.                 item->child(i)->setCheckState(0,Qt::Checked);  
  13.             }  
  14.         }  
  15.         else  
  16.         {  
  17.             updateParentItem(item);  
  18.         }  
  19.      }  
  20.     else if(Qt::Unchecked == item->checkState(0))  
  21.     {  
  22.         int count = item->childCount();  
  23.         if(count > 0)  
  24.         {  
  25.             for(int i=0; i<count; i++)  
  26.             {  
  27.                 item->child(i)->setCheckState(0,Qt::Unchecked);  
  28.             }  
  29.         }  
  30.         else  
  31.         {  
  32.             updateParentItem(item);  
  33.         }  
  34.     }  
  35. }  


void Widget::updateParentItem(QTreeWidgetItem* item)

[cpp] view plain copy
  1. void Widget::updateParentItem(QTreeWidgetItem* item)  
  2. {  
  3.     QTreeWidgetItem *parent = item->parent();  
  4.     if(parent == NULL)  
  5.     {  
  6.         return ;  
  7.     }  
  8.     int selectedCount = 0;  
  9.     int childCount = parent->childCount();  
  10.     for(int i=0; i<childCount; i++) //判断有多少个子项被选中  
  11.     {  
  12.         QTreeWidgetItem* childItem = parent->child(i);  
  13.         if(childItem->checkState(0) == Qt::Checked)  
  14.         {  
  15.             selectedCount++;  
  16.         }  
  17.     }  
  18.     if(selectedCount <= 0)  //如果没有子项被选中,父项设置为未选中状态  
  19.     {  
  20.         parent->setCheckState(0,Qt::Unchecked);  
  21.     }  
  22.     else if(selectedCount>0 && selectedCount<childCount)    //如果有部分子项被选中,父项设置为部分选中状态,即用灰色显示  
  23.     {  
  24.         parent->setCheckState(0,Qt::PartiallyChecked);  
  25.     }  
  26.     else if(selectedCount == childCount)    //如果子项全部被选中,父项则设置为选中状态  
  27.     {  
  28.         parent->setCheckState(0,Qt::Checked);  
  29.     }  
  30. }  

6.  至此,本程序的所有代码就编写完了。点击运行按钮,

运行结果如下:(我鼠标点击过)

Qt创建具有复选框的树形控件


小知识点:

Qt提供了很丰富的函数库,想要全部记住,非一般人能做到的。(就算是自己写的,也不一定能全部记住吧)

所有此时Qt助手便闪亮登场了。

比如当我们不知道函数setCheckState()的具体功能或者用法时,只需要将鼠标定位在这个函数上面,然后按鼠标F1键,此时Qt Creater便会弹出关于此函数的帮助信息。

Qt创建具有复选框的树形控件


源博客地址:http://blog.csdn.net/rl529014/article/details/51355968