点击的父节点
显示的是在主枝干
点击添加了四个子节点
选中勾选。
注意全勾选的区别。
删除添加子节点2
把添加子节点3–>改成编辑啦
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QMenu>
#include <QAction>
#include <QTreeWidgetItem>
#include <QContextMenuEvent>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
public:
void init();
void updateParentItem(QTreeWidgetItem* item);
public slots:
void treeItemChanged(QTreeWidgetItem* item,int column);
private slots:
void on_pushButton_2_clicked();
void on_pushButton_4_clicked();
void on_pushButton_3_clicked();
void on_pushButton_clicked();
void onMemberMenuTriggered(QAction *action);
private:
Ui::Widget *ui;
//声明动作
QAction *buttonAction1;
//声明菜单
QMenu * buttonMenu;
QTreeWidgetItem * AddTreeRoot(QString name);
QTreeWidgetItem * AddTreeNode(QTreeWidgetItem *parent,QString name);
//child menu
QMenu *m_memberMenu;
QMenu *m_addAreaMenu;
//child action
QAction *m_memberDelete;
QAction *m_memberMove;
QAction *m_memberSyncTime;
void createItemMenu(); //构造函数中调用此函数
void contextMenuEvent(QContextMenuEvent *event);
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
createItemMenu();
init();
connect(ui->treeWidget,SIGNAL(itemChanged(QTreeWidgetItem*,int)),
this, SLOT(treeItemChanged(QTreeWidgetItem*,int)));
}
Widget::~Widget()
{
delete ui;
}
void Widget::init()
{
ui->treeWidget->clear();
for(int i=0;i<5;i++)
{
QTreeWidgetItem *groupl = new QTreeWidgetItem(ui->treeWidget);
groupl->setText(0, "groupl");
groupl->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::
ItemIsSelectable);
groupl->setCheckState(0, Qt::Unchecked);
}
}
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);
}
}
void Widget::treeItemChanged(QTreeWidgetItem *item, int column)
{
//选中时
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::on_pushButton_2_clicked()
{
QString name = ui->lineEdit->text();
AddTreeRoot(name);
}
QTreeWidgetItem * Widget::AddTreeRoot(QString name)
{
QTreeWidgetItem * item=new QTreeWidgetItem(QStringList()<<name);
item->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::
ItemIsSelectable);
item->setCheckState(0, Qt::Unchecked);
ui->treeWidget->addTopLevelItem(item);
return item;
}
void Widget::on_pushButton_4_clicked()
{
QString name = ui->lineEdit->text();
QTreeWidgetItem * item= ui->treeWidget->currentItem();
if(item!=NULL)
{
AddTreeNode(item,name);
}
else
{
AddTreeRoot(name);
}
}
QTreeWidgetItem * Widget::AddTreeNode(QTreeWidgetItem *parent,QString name)
{
QTreeWidgetItem * item=new QTreeWidgetItem(QStringList()<<name);
item->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::
ItemIsSelectable);
item->setCheckState(0, Qt::Unchecked);
parent->addChild(item);
return item;
}
void Widget::createItemMenu()
{
m_memberMenu = new QMenu(this);
connect(m_memberMenu,SIGNAL(triggered(QAction *)),
this,SLOT(onMemberMenuTriggered(QAction *)));
m_memberDelete = new QAction(tr("添加节点"),this);
m_memberMove = new QAction(tr("删除节点"),this);
m_memberSyncTime = new QAction(tr("编辑节点"),this);
}
void Widget::contextMenuEvent(QContextMenuEvent *event)
{
QTreeWidgetItem *item = ui->treeWidget->currentItem();
if(item == NULL)
{
qDebug()<<"空白处";
if (m_addAreaMenu->isEmpty())
{
//增加区域
// m_addAreaMenu->addAction(m_addAreaAction);
// m_addAreaMenu->addAction(m_addDev);
// m_addAreaMenu->addAction(m_grpFlush);
}
//菜单出现的位置为当前鼠标的位置
m_addAreaMenu->exec(QCursor::pos());
}
else if(ui->treeWidget->currentItem()->childCount() == 0)
{
if (m_memberMenu->isEmpty())
{
//删除设备
m_memberMenu->addAction(m_memberDelete);
//移动设备
m_memberMenu->addAction(m_memberMove);
//同步时间
m_memberMenu->addAction(m_memberSyncTime);
}
m_memberMenu->exec(QCursor::pos());
}
event->accept();
}
void Widget::on_pushButton_3_clicked()
{
QTreeWidgetItem * currentItem = ui->treeWidget->currentItem();
if(currentItem == NULL)
{
return;
}
if(currentItem->parent()==NULL)
{
delete ui->treeWidget->takeTopLevelItem(ui->treeWidget->currentIndex().row());
}
else
{
delete currentItem->parent()->takeChild(ui->treeWidget->currentIndex().row());
}
}
void Widget::on_pushButton_clicked()
{
QTreeWidgetItem * currentItem = ui->treeWidget->currentItem();
QString name = ui->lineEdit->text();
if(currentItem==NULL)
{
return;
}
for(int i=0;i<currentItem->columnCount();i++)
{
currentItem->setText(i,name);
}
}
void Widget::onMemberMenuTriggered(QAction *action)
{
if (action == m_memberDelete)
{//添加
QString name = ui->lineEdit->text();
QTreeWidgetItem * item= ui->treeWidget->currentItem();
if(item!=NULL)
{
AddTreeNode(item,name);
}
else
{
AddTreeRoot(name);
}
}
else if(action == m_memberMove)
{//删除
QTreeWidgetItem * currentItem = ui->treeWidget->currentItem();
if(currentItem == NULL)
{
return;
}
if(currentItem->parent()==NULL)
{
delete ui->treeWidget->takeTopLevelItem(ui->treeWidget->currentIndex().row());
}
else
{
delete currentItem->parent()->takeChild(ui->treeWidget->currentIndex().row());
}
}
else if(action == m_memberSyncTime)
{
//编辑
QTreeWidgetItem * currentItem = ui->treeWidget->currentItem();
QString name = ui->lineEdit->text();
if(currentItem==NULL)
{
return;
}
for(int i=0;i<currentItem->columnCount();i++)
{
currentItem->setText(i,name);
}
}
}
UI图.