Qt创建具有复选框的树形控件
2017-10-27 10:07
357 查看
在Qt中的树形控件称为QTreeWidget,而控件里的树形节点称为QTreeWidgetItem。
关于QTreeWidget控件和QTreeWidgetItem的更多详细知识点,可以查看Qt的官方帮助文档。
QTreeWidget类:
QTreeWidgetItem类:
实现的功能:
创建树形控件,当选中顶层树形节点时,子节点全部选中。
当选中部分子节点时,顶层树形节点处于灰色未全部选中状态。(部分选中状态)
当子节点全部选中,顶层节点变为选中状态。
具体步骤:
1. 新建Qt GUI应用,项目名称自定,基类选择QWidget,选中“创建界面”复选框。
2. 双击“widget.ui”文件,打开Qt界面设计器,拖出一份QTreeWidget控件。
2. 在头文件“widget.h”中添加上相应的头文件
[cpp] view
plain copy
#include<QTreeWidgetItem>
在Widget的类申明中添加如下代码:
[cpp] view
plain copy
public: //申明初始化函数
void init();
void updateParentItem(QTreeWidgetItem* item);
public slots: //申明信号与槽,当树形控件的子选项被改变时执行
void treeItemChanged(QTreeWidgetItem* item , int column);
4. 在源文件“widget.cpp”中的类Widget构造函数中添加如下代码:
[cpp] view
plain copy
init();
connect(ui->treeWidget,SIGNAL(itemChanged(QTreeWidgetItem*,int)),this,SLOT(treeItemChanged(QTreeWidgetItem*,int)));
5. 在源文件“widget.cpp”中实现各个函数:
void Widget::init()
[cpp] view
plain copy
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)
[cpp] view
plain copy
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)
[cpp] view
plain copy
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便会弹出关于此函数的帮助信息。
源博客地址:http://blog.csdn.net/rl529014/article/details/51355968
关于QTreeWidget控件和QTreeWidgetItem的更多详细知识点,可以查看Qt的官方帮助文档。
QTreeWidget类:
QTreeWidgetItem类:
实现的功能:
创建树形控件,当选中顶层树形节点时,子节点全部选中。
当选中部分子节点时,顶层树形节点处于灰色未全部选中状态。(部分选中状态)
当子节点全部选中,顶层节点变为选中状态。
具体步骤:
1. 新建Qt GUI应用,项目名称自定,基类选择QWidget,选中“创建界面”复选框。
2. 双击“widget.ui”文件,打开Qt界面设计器,拖出一份QTreeWidget控件。
2. 在头文件“widget.h”中添加上相应的头文件
[cpp] view
plain copy
#include<QTreeWidgetItem>
在Widget的类申明中添加如下代码:
[cpp] view
plain copy
public: //申明初始化函数
void init();
void updateParentItem(QTreeWidgetItem* item);
public slots: //申明信号与槽,当树形控件的子选项被改变时执行
void treeItemChanged(QTreeWidgetItem* item , int column);
4. 在源文件“widget.cpp”中的类Widget构造函数中添加如下代码:
[cpp] view
plain copy
init();
connect(ui->treeWidget,SIGNAL(itemChanged(QTreeWidgetItem*,int)),this,SLOT(treeItemChanged(QTreeWidgetItem*,int)));
5. 在源文件“widget.cpp”中实现各个函数:
void Widget::init()
[cpp] view
plain copy
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)
[cpp] view
plain copy
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)
[cpp] view
plain copy
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便会弹出关于此函数的帮助信息。
源博客地址:http://blog.csdn.net/rl529014/article/details/51355968
相关文章推荐
- Qt: 创建具有复选框的树形控件
- QT-创建具有复选框的树形控件
- Qt树形控件QTreeView使用2——复选框的设置
- Qt树形控件QTreeView使用1——节点的添加删除操作 复选框的设置
- QT--复选框树形控件的使用
- 创建具有复选框的树型控件
- Qt树形控件QTreeView使用1——节点的添加删除操作 复选框的设置
- Qt树形控件QTreeView使用2——复选框的设置
- Flex中如何利用树形控件(Tree Control)和SWFLoader控件创建简单图片相册的例子
- 演练:ASP.NET控件实现 创建具有成员资格和用户登录功能的网站
- 提升方式创建自己的QT控件(弹出式菜单按钮)
- Qt树形控件QTreeView使用1——节点的添加删除操作
- Qt 树形控件QTreeWidget
- 创建具有自验证功能的textbox控件
- Qt动态创建控件并实现布局
- delphi 动态创建 复选框控件
- qt 根据选择栏目动态创建控件
- Qt QTreeWidget(树形控件)的用法
- [JAVASCRIPT][EXTJS]直接用JSON创建树形控件(Ext.tree.TreePanel )
- Qt笔记(6)自定义控件 一 创建最简单的控件