项目1 :项目控件组(Item Widgets)
具体步骤如下。
(1)新建QtGui应用(详见本书第1章1.3.1节),项目名称为“TreeWidget”,基类选择“QWidget”,类名保持“Widget”不变,保持“创建界面”复选框的选中状态。
(2)双击“widget.ui”文件,打开Qt的设计器,拖曳出一个QTreeWidget。
(3)在头文件“widget.h”中添加代码:
#include <QTreeWidgetItem>
在类Widget声明中添加代码:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTreeWidgetItem>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
void init();
void updateParentItem(QTreeWidgetItem* item);
private:
Ui::Widget *ui;
public slots:
void treeItemChanged(QTreeWidgetItem* item, int column);
};
#endif
//
WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
init(); /*初始化tree item*/
connect (ui->treeWidget, SIGNAL(itemChanged(QTreeWidgetItem*,int)),
this, SLOT(treeItemChanged(QTreeWidgetItem*,int)));
}
Widget::~Widget()
{
delete ui;
}
void Widget::init ()
{
ui->treeWidget->clear ();
//第一分组(显示在ui->treeWidget框内)
QTreeWidgetItem* group1 = new QTreeWidgetItem(ui->treeWidget);
group1->setText (0, "group11");
group1->setFlags (Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
group1->setCheckState (0, Qt::Unchecked); //初始值是没有选中
//添加第一个成员
QTreeWidgetItem* subItem11 = new QTreeWidgetItem(group1);
subItem11->setText (0, "subItem11");
subItem11->setFlags (Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
subItem11->setCheckState (0, Qt::Unchecked);
//添加第二个成员
QTreeWidgetItem* subItem12 = new QTreeWidgetItem(group1);
subItem12->setText (0, "subItem12");
subItem12->setFlags (Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
subItem12->setCheckState (0, Qt::Unchecked);
//添加第三个成员
QTreeWidgetItem* subItem13 = new QTreeWidgetItem(group1);
subItem13->setText (0, "subItem13");
subItem13->setFlags (Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
subItem13->setCheckState (0, Qt::Unchecked);
//添加第四个成员
QTreeWidgetItem* subItem14 = new QTreeWidgetItem(group1);
subItem14->setText (0, "subItem14");
subItem14->setFlags (Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
subItem14->setCheckState (0, Qt::Unchecked);
//第二分组(显示在ui->treeWidget框内)
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->setText (0, "subItem21");
subItem21->setFlags (Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
subItem21->setCheckState (0, Qt::Unchecked);
//添加第二个成员
QTreeWidgetItem* subItem22 = new QTreeWidgetItem(group2);
subItem22->setText (0, "subItem22");
subItem22->setFlags (Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
subItem22->setCheckState (0, Qt::Unchecked);
//添加第三个成员
QTreeWidgetItem* subItem23 = new QTreeWidgetItem(group2);
subItem23->setText (0, "subItem23");
subItem23->setFlags (Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
subItem23->setCheckState (0, Qt::Unchecked);
//添加第四个成员
QTreeWidgetItem* subItem24 = new QTreeWidgetItem(group2);
subItem24->setText (0, "subItem24");
subItem24->setFlags (Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
subItem24->setCheckState (0, Qt::Unchecked);
}
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)
{
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);
}
}