Qt QTreeWidget

新建一个Qt Widgets Application,拖拽一个Tree Widget 到 ui 界面上,最后实现的效果如下:

 添加代码

 //test.h

 //在头文件里添加两个公用函数还有一个槽函数的声明

 #include <QTreeWidgetItem>

 public:

  void initTreeWidget();

  void updateParentItem(QTreeWidgetItem *item);

 public:

  void treeItemChanged(QTreeWidgetItem *item,int column);

 //test.cpp

 //在构造函数里添加 connect()

  initTreeWidget();

  connect(ui->treeWidget,SIGNAL(itemChanged(QTreeWidgetItem *,int)),this,SLOT(treeItemChanged(QTreeWidgetItem*,int)));

 //initTreeWidget() 的实现

 void test::initTreeWidget()

 {

     ui->treeWidget->clear();

     //第一组

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

     group1->setText(,"group1");

     group1->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);

     group1->setCheckState(,Qt::Unchecked);

     QTreeWidgetItem *item11=new QTreeWidgetItem(group1);

     item11->setText(,"item11");

     item11->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);

     item11->setCheckState(,Qt::Unchecked);

     QTreeWidgetItem *item12=new QTreeWidgetItem(group1);

     item12->setText(,"item12");

     item12->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);

     item12->setCheckState(,Qt::Unchecked);

     QTreeWidgetItem *item13=new QTreeWidgetItem(group1);

     item13->setText(,"item13");

     item13->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);

     item13->setCheckState(,Qt::Unchecked);

     //第二组

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

     group2->setText(,"group2");

     group2->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);

     group2->setCheckState(,Qt::Unchecked);

     QTreeWidgetItem *item21=new QTreeWidgetItem(group2);

     item21->setText(,"item21");

     item21->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);

     item21->setCheckState(,Qt::Unchecked);

     QTreeWidgetItem *item22=new QTreeWidgetItem(group2);

     item22->setText(,"item22");

     item22->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);

     item22->setCheckState(,Qt::Unchecked);

     QTreeWidgetItem *item23=new QTreeWidgetItem(group2);

     item23->setText(,"item23");

     item23->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);

     item23->setCheckState(,Qt::Unchecked);

 }

 //treeItemChanged(QTreeWidgetItem *item, int column)的实现

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

 {

     QString itemText=item->text();

     //选中时

     if(Qt::Checked==item->checkState())

     {

         QTreeWidgetItem* parent=item->parent();

         int count=item->childCount();

         if(count>)

         {

             for(int i=;i<count;i++)

             {

                 //子节点也被选中

                 item->child(i)->setCheckState(,Qt::Checked);

             }

         }

         else

         {

             //是子节点

             updateParentItem(item);

         }

     }

     else if(Qt::Unchecked==item->checkState())

     {

         int count=item->childCount();

         if(count>)

         {

             for(int i=;i<count;i++)

             {

                 item->child(i)->setCheckState(,Qt::Unchecked);

             }

         }

         else

         {

             //是子节点

             updateParentItem(item);

         }

     }

 }

 //updateParentItem(QTreeWidgetItem *item) 的实现

 void test::updateParentItem(QTreeWidgetItem *item)

 {

     QTreeWidgetItem* parent=item->parent();

     if(parent==NULL)

     {

         return;

     }

     //选中的子节点个数

     int selectCount=;

     int childCount=parent->childCount();

     for(int i=;i<childCount;i++)

     {

         QTreeWidgetItem *childItem=parent->child(i);

         if(childItem->checkState()==Qt::Checked)

         {

             selectCount++;

         }

     }

     if(selectCount<=)

     {

         //选中状态

         parent->setCheckState(,Qt::Unchecked);

     }

     else if(selectCount> && selectCount<childCount)

     {

         //部分选中状态

         parent->setCheckState(,Qt::PartiallyChecked);

     }

     else if(selectCount==childCount)

     {

         //未选中状态

         parent->setCheckState(,Qt::Checked);

     }

 }

QTreeWidget 的用法的更多相关文章

  1. EditText 基本用法

    title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...

  2. jquery插件的用法之cookie 插件

    一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...

  3. Java中的Socket的用法

                                   Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...

  4. [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法

    一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...

  5. python enumerate 用法

    A new built-in function, enumerate() , will make certain loops a bit clearer. enumerate(thing) , whe ...

  6. [转载]Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结

    本文对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法进行了详细的总结,需要的朋友可以参考下,希望对大家有所帮助. 详细解读Jquery各Ajax函数: ...

  7. 【JavaScript】innerHTML、innerText和outerHTML的用法区别

    用法: <div id="test">   <span style="color:red">test1</span> tes ...

  8. chattr用法

    [root@localhost tmp]# umask 0022 一.chattr用法 1.创建空文件attrtest,然后删除,提示无法删除,因为有隐藏文件 [root@localhost tmp] ...

  9. 萌新笔记——vim命令“=”、“d”、“y”的用法(结合光标移动命令,一些场合会非常方便)

    vim有许多命令,网上搜有一堆贴子.文章列举出各种功能的命令. 对于"="."d"."y",我在无意中发现了它们所具有的相同的一些用法,先举 ...

随机推荐

  1. 洛谷 [P3623] 免费道路

    有 k 条特殊边的生成树 我们发现有一些边是必须的,如果把所有的水泥路都加入并查集,再枚举鹅卵石路,如果这条路能再次加入并查集,说明这条路是必须的 水泥路同样 这样就把必需边求出来了,剩下就可以随意加 ...

  2. 【小米3使用经验】小米3联通版 miui7.2.11稳定版刷机

    1.我的手机是小米3联通版的,买来后为了配合公司的手机开发,将Android系统升级到4.4.4版本,MiUi为默认版本. 前段时间可能不小心开启了自动升级,结果Android系统升级到6.0.1版本 ...

  3. CocoaPods Setting up CocoaPods master repo无反应时的处理

    Setting up CocoaPods master repo,半天没有任何反应.原因无他,因为那堵墙阻挡了cocoapods.org...gitcafe和oschina都是国内的服务器,可以用它们 ...

  4. 宝宝舌苔发白,消化不好 http://wenwen.soso.com/z/q103192661.htm

    你好,宝宝咳嗽,如果舌苔是白的,则是风寒咳嗽,说明孩子寒重,咳嗽的痰也较稀.白黏,并兼有鼻塞流涕,这时应吃一些温热.化痰止咳的食品.如果孩子的舌苔是黄.红,则是风热咳嗽,说明孩子内热较大,咳嗽的痰黄. ...

  5. jenkins 中 violation使用pylint

    在jenkins中无法打开源码问题: 1. 在 Report Violations的 Source encoding 设置为 项目文件的编码, 如: utf-8.  缺省是 default. 2. 在 ...

  6. LeetCode OJ-- Valid Sudoku

    https://oj.leetcode.com/problems/valid-sudoku/ 给出数独的一部分来,验证给出的这一部分是否为 valid 行上无重复的,且是从 ‘1’ 到‘9’ 列上无重 ...

  7. Educational Codeforces Round 34 D. Almost Difference【模拟/stl-map/ long double】

    D. Almost Difference time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  8. Java多线程总结之由synchronized说开去

    更新完毕,结贴,以后有新的想法再开新帖 这几天不断添加新内容,给个大概的提纲吧,方面朋友们阅读,各部分是用分割线隔开了的: synchronized与wait()/notify() JMM与synch ...

  9. idea---搭建maven,tomcat入门

    这篇随笔讲讲idea工具的安装和使用和在idea中搭建maven的分享. 一.概念 1.IntelliJ IDEA是什么? DEA 全称 IntelliJ IDEA,是java编程语言开发的集成环境. ...

  10. 【转】【Stackoverflow好问题】去掉烦人的“!=null"(判空语句)

    [Stackoverflow好问题]去掉烦人的“!=null"(判空语句) 问题 为了避免空指针调用,我们经常会看到这样的语句   ...if (someobject != null) { ...