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

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

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

QTreeWidget类:

QTreeWidgetItem类:

实现的功能:

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

具体步骤:

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

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

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

#include<QTreeWidgetItem>

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

public: //申明初始化函数
    void init();
    void updateParentItem(QTreeWidgetItem* item);

public slots:   //申明信号与槽,当树形控件的子选项被改变时执行
    void treeItemChanged(QTreeWidgetItem* item , int column);

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

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

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

void Widget::init()

void Widget::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::Checked); //设置子选项的显示格式和状态

    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* 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 Widget::treeItemChanged(QTreeWidgetItem* item, int column)

void Widget::treeItemChanged(QTreeWidgetItem* item, int column)
{
    //QString itemText = item->text(0);
    if(Qt::Checked == item->checkState(0))
    {
       // QTreeWidgetItem* parent = item->parent();
        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);
        }
    }
}

void Widget::updateParentItem(QTreeWidgetItem* item)

void Widget::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);
    }
}

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

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

小知识点:

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

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

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

时间: 2024-10-10 08:30:23

Qt: 创建具有复选框的树形控件的相关文章

WPF: 实现带全选复选框的列表控件

本文将说明如何创建一个带全选复选框的列表控件.其效果如下图:     这个控件是由一个复选框(CheckBox)与一个 ListView 组合而成.它的操作逻辑: 当选中“全选”时,列表中所有的项目都会被选中:反之,取消选中“全选”时,所有项都会被取消勾选. 在列表中选中部分数据项目时,“全选”框会呈现不确定状态(Indetermine). 由此看出,“全选”复选框与列表项中的复选框达到了双向控制的效果. 其设计思路:首先,创建自定义控件(CheckListView),在其 ControlTem

COCOS学习笔记--复选框CheckBox及其控件属性

一.Button介绍 游戏开发中有时我们会用到CheckBox,CheckBox就是复选框,大家应该都见过复选框,它有两个状态,一个勾选态,一个非勾选态,我们可以通过CheckBox在这两个状态间的切换来实现一些特定的判断功能,比如是否游戏关闭音效等. CheckBox也和cocos提供的其他控件一样,我们可以在Cocos Studio中创建并设置相关属性,在代码工程中使用:也可以之间在代码工程中创建使用.CheckBox类提供了对复选框的相关方法,其继承自Widget类: 接下来就通过实例来看

ExtJs实现复选框组Checkboxgroup单勾选及复选框组对多个复选框组跨控件全选

ExtJs实现复选框Checkboxgroup单勾选及跨控件全选 由于项目的需要,我们要将EXT的控件Checkboxgroup复选框组改造成但勾选,并且实现一个复选框组控制其他多个复选框组的全选,以下是关于如何实现的代码片段. 1.创建CheckboxGroup对象 1,新建空的EOS6.5的工程,新建com.towngas.tcis. gridlock构件包: 2,在com.towngas.tcis.gridlock构件包的"展现"节点下的"页面资源"节点中创建

制作带复选框的ListView控件

实现效果: 知识运用   ListView控件的GridLines //设置是否在ListView控件中显示网格线 public bool GridLines{get;set} 和CheckBoxes属性 //设置listView控件中各数据项是否显示复选框 public bool CheckBoxes{get;set} 以及ListViewItem数据项的Checked属性 //判断是否选中此数据项中的复选框 public bool Checked{get;set} 实现代码: private

dojo中创建包含节点复选框的树形(CheckBoxTree)

树形结构是界面设计程中常见的部件,在代码实现时有很多方法,但由于设计到节点的父子关系和dom节点操作,实现起来比较复杂.dojo中提供了带复选框的树形部件CheckBoxTree,使用时只需创建对应的实例即可轻松实现此功能. 部件对应的html文件代码如下: <div> <div dojoType="dijit.Dialog" dojoAttachPoint="testList" title="${title}" style=&

实现ListView带多选框等状态控件实现Adapter出现紊乱

Android本身为ListView提供了几个方便的Adapter,比如ArrayAdapter.SimpleCurrentAdapter等等.但是为了实现更复杂的列表视图和控制,一般都要继承BaseAdapter来实现自己的Adapter. 我需要的ListView是如图一样的列表,每个列表项由一个TextView.3个CheckBox组成,3个checkbox选中为红色图片,为选中为白色背景图片因此需要对每个列表项的CheckBox设置监听器.若使用Android提供的Adapter实现起来

Qt树形控件QTreeView使用1——节点的添加删除操作 复选框的设置

QtreeView是ui中最常用的控件,Qt中QTreeWidget比QTreeView更简单,但没有QTreeView那么灵活(QTreeWidget封装的和MFC的CTreeCtrl很类似,没有mvc的特点). 1. QStandardItemModel在QTreeView中的使用 使用QTreeView的对应模型是QStandardItemModel,这个是Qt对应ui界面最有用的模型,它可以用于树形控件.列表控件.表格控件等等和条目有关的控件.QStandardItemModel用于列表

[CSS]复选框单选框与文字对齐问题的研究与解决.

前言:今天碰到的这个问题, 恰好找到一个很好的博文, 在这里转载过来 学习下. 原文地址:复选框单选框与文字对齐问题的研究与解决. 目前中文网站上面的文字,就我的个人感觉而言,绝大多数网站的主流文字大小为12px,因为在目前高分辨率显示器屏幕下,11px的汉字,其像素点开始不规整,文字不如12px来的显示良好.12px大小的文字就是主流也是底线.然而12px的文字与单选框和复选框是不对齐的.例如下面这张雅虎中国首页在火狐浏览器下的截图: 雅虎中国首页单选框复选框与文字不对齐 这里,不是说,雅虎中

关于IE下复选框的样式问题

一.为什么复选框与后面的文字有间距 1.在FF,chrome,Safari等浏览器,是由margin引起的,也就是checkbox有默认margin-right:3px.(FF下复选框默认margin值为3px 3px 3px 4px,chrome与之一致 )2.IE6-IE8是由本身引起的. FF的虚框直接依附在复选框本身的边框上,IE6是偌大的区域,复选框只是位居其中,IE8下虚框的范围更加对称. 给复选框加border和background,IE6下如图,IE7类似,IE8更对称些,FF下