文档章节

QT中的树型控件QTreeWidget和checkstate的使用

barsoom
 barsoom
发布于 2012/11/02 11:39
字数 690
阅读 8967
收藏 1
今天简单说一下Qt的树形控件,在Qt中树形控件的名称叫做QTreeWidget,而控件里的树节点的名称叫做QTreeWidgetItem。今天这 里讲的是如何创建具有复选框的树形控件:

当选中顶层的树形节点时,子节点全部被选中,当取消顶层树形节点时,子节点全部被取消选中状态,而当选中子节点时,父节点显示部分选中的状态。

      要实现这种界面其实很简单的。在Qt的设计器中,拖出一个QTreeWidget,然后在主窗口中写一个函数init初始化界面,连接树形控件的节点改变 信号itemChanged(QTreeWidgetItem* item, int column),实现这个信号的即可。下面是具体代码:

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

void TreeWidgetTest::init()
{
    ui.treeWidget->clear();

   //第一个分组
   QTreeWidgetItem *group1 = new QTreeWidgetItem(ui.treeWidget);
   group1->setText(0, "group1");
   group1->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
   group1->setCheckState(0, Qt::Unchecked);

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

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

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

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

//第二个分组
  QTreeWidgetItem *group2 = new QTreeWidgetItem(ui.treeWidget);
  group2->setText(0, "group2");
  group2->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
  group2->setCheckState(0, Qt::Unchecked);

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

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

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

}

void holidayquery::treeItemChanged(QTreeWidgetItem *item, int column){
 if(Qt::Checked == item->checkState(0)){ // 选中
     int count = item->childCount();
     if (count > 0){
         for (int i = 0; i < count; i++){
         //子节点也选中
         item->child(i)->setCheckState(0, Qt::Checked) ;
         }
     }else{
     //是子节点
     updateParentItem(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{
         updateParentItem(item);
     }
 }else { // Qt::PartiallyChecked == item->checkState(0)
     ui->textEdit->append("部分选中");
 }
}
//
void holidayquery::updateParentItem(QTreeWidgetItem* item){
     QTreeWidgetItem *parent = item->parent();
     if (parent == NULL){
         return;
     }
     //选中的子节点个数
     int selectedCount = 0;
     int childCount = parent->childCount();
     for (int i = 0; i < childCount; i++){
         QTreeWidgetItem *childItem = parent->child(i);
         if (childItem->checkState(0) == Qt::Checked){
             selectedCount++;
         }
     }
     if (selectedCount <= 0){
     //选中状态
         parent->setCheckState(0, Qt::Unchecked);
     }else if(selectedCount > 0 && selectedCount < childCount){
     //部分选中状态
         parent->setCheckState(0, Qt::PartiallyChecked);
     }else if(selectedCount == childCount){
     //未选中状态
     parent->setCheckState(0, Qt::Checked);
 }
//    changeFromUser = true;
}

      上面需要注意的是,当用代码setCheckState后,会触发itemChanged事件,有时这个会带来麻烦,这时需要加一些标志来判断是由用户操作产生的还是程序本身代码产生的。

© 著作权归作者所有

下一篇: QT定时器QTimer
barsoom
粉丝 11
博文 121
码字总数 110872
作品 0
南京
程序员
私信 提问
阅读Qt Creator--PluginDialog 和 PluginView分析

PluginView是插件管理器中所管理插件的可视化的查看类,派生自QWidget,可以作为任何QWidget的子类的子窗口。 方法列表及说明: signals: void currentPluginChanged(ExtensionSystem::Plug...

Michael_BJFU
2012/07/10
538
0
【Qt笔记】QListWidget、QTreeWidget 和 QTableWidget

上一章我们了解了 model/view 架构的基本概念。现在我们从最简单的、和三个类开始了解最简单的 model/view 的使用。这部分内容的确很难组织。首先,从最标准的 model/view 开始,往往会纠结于...

大道无名
2016/08/01
284
0
QTreeWidget的用法

QTreeWidgetItem有九个重载的函数,如果在构造的时候指定了parent,就不需要在后面用insertTopLevelItems来插入到里面,如果没有指定parent,就把所有的根节点放到QList中,然后使 用insertT...

晨曦之光
2012/04/13
6.8K
0
扩展UltraGrid控件实现对所有数据行的全选功能[Source Code下载]

在前面一篇文章中,我通过对三种Infragistics 控件(UltraToolBarManager、UltraGird和UltraListView)进行扩展,以实现对ToolTip样式的定义,今天我来介绍如何采用相同的方式实现另外一个更...

长平狐
2012/09/04
873
0
QTreeWidget 作为用户列表控件,每个Item是一个QWidget

如题,要做一个用户列表,打算使用QTreeWidget做,但是QTreeWidgetItem感觉不好实现,因为要添加鼠标右键时间和头像可以点击出弹窗,所以怎么做QTreeWidget 每个Item是一个QWidget?...

锋了
2014/12/14
770
5

没有更多内容

加载失败,请刷新页面

加载更多

【0918】正则介绍_grep

【0918】正则介绍_grep 9.1 正则介绍_grep上 9.2 grep中 9.3 grep下 一、正则介绍 正则是一串有规律的字符串,它使用单个字符串来描述或匹配一系列符合某个语法规则的字符串。 二、grep工具 ...

飞翔的竹蜻蜓
23分钟前
4
0
为什么要在网站中应用CDN加速?

1. 网页加载速度更快 在网站中使用CDN技术最直接的一个好处就是它可以加快网页的加载速度。首先,CDN加速的内容分发是基于服务器缓存的,由于CDN中缓存了不少数据,它能够给用户提供更快的页...

云漫网络Ruan
今天
8
0
亚玛芬体育(Amer Sports)和信必优正式启动合作开发Movesense创新

亚玛芬体育和信必优正式启动合作开发Movesense创新,作为亚玛芬体育的完美技术搭档,信必优利用Movesense传感器技术为第三方开发移动应用和服务。 Movesense基于传感器技术和开放的API,测量...

symbiochina88
今天
4
0
创龙TI AM437x ARM Cortex-A9 + Xilinx Spartan-6 FPGA核心板规格书

SOM-TL437xF是一款广州创龙基于TI AM437x ARM Cortex-A9 + Xilinx Spartan-6 FPGA芯片设计的核心板,采用沉金无铅工艺的10层板设计,适用于高速数据采集和处理系统、汽车导航、工业自动化等领...

Tronlong创龙
今天
5
0
好程序员Java学习路线分享MyBatis之线程优化

  好程序员Java学习路线分享MyBatis之线程优化,我们的项目存在大量用户同时访问的情况,那么就会出现大量线程并发访问数据库,这样会带来线程同步问题,本章我们将讨论MyBatis的线程同步问...

好程序员官方
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部