QTreeWidget (checkbox树)增加、删除、拖拽、选择获取item text 和checkbox bool值

13 篇文章 1 订阅

公司项目用到的,qt使用了QTreeWidget,里边涉及了增加、删除、拖拽和点击获取item text和checkbox bool值,上代码
TabTreeWidget.h

#ifndef TABTREEWIDGET_H
#define TABTREEWIDGET_H

#include<QTreeWidgetItem>
#include<QTreeWidget>
#include<QDragEnterEvent>
#include<QDragMoveEvent>
#include<QDropEvent>
class QDialog;

class TabTreeWidget :public QTreeWidget
{
	Q_OBJECT
public:
	TabTreeWidget(QWidget* parent = 0);

protected:
	//void dragEnterEvent(QDragEnterEvent *event);
	//void dragMoveEvent(QDragMoveEvent *event);
	//void dropEvent(QDropEvent *event);

public: 
	void init();
	void updateParentItem(QTreeWidgetItem* item);
	QTreeWidget* treeWidget;
	QTreeWidgetItem* curItem;
	void newGroup();
	void addTreeNode(QString name, QString gname);

public slots:  
	void treeItemChanged(QTreeWidgetItem* item, int column);
	void popMenu(const QPoint&);
	void deleteItem();
	void testAddTreeNode();
	void slotClickItem(QTreeWidgetItem* item, int col);
};
#endif

TabTreeWidget.cpp

#include <QTreeWidgetItem>
#include <QTreeWidget>
#include "TabTreeWidget.h"
#include <QMenu>
#include <QMimeData>
#include <QDrag>
#include <QDebug>
#include <QMessageBox>
TabTreeWidget::TabTreeWidget(QWidget *parent)
	:QTreeWidget(parent)
{
	init();
	this->setContextMenuPolicy(Qt::CustomContextMenu);
	connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(popMenu(const QPoint&)));
	connect(this, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(slotClickItem(QTreeWidgetItem *, int)));
	//setDragEnabled(true);
	//setAcceptDrops(true);
	//setHeaderHidden(true);
	//setDragDropMode(QAbstractItemView::InternalMove);
}


void TabTreeWidget::init()
{
    this->clear();    //初始化


    QTreeWidgetItem* group1 = new QTreeWidgetItem(this);
    group1->setText(0,"group1");  
	group1->setWhatsThis(0, "Group");
    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->setWhatsThis(0, "Device");
    subItem11->setCheckState(0,Qt::Checked); 
 
    QTreeWidgetItem* subItem12 = new QTreeWidgetItem(group1);
    subItem12->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
    subItem12->setText(0,"subItem12");
	subItem12->setWhatsThis(0, "Device");
    subItem12->setCheckState(0,Qt::Unchecked);
 
    QTreeWidgetItem* subItem13 = new QTreeWidgetItem(group1);
    subItem13->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
    subItem13->setText(0,"subItem13");
	subItem13->setWhatsThis(0, "Device");
    subItem13->setCheckState(0,Qt::Unchecked);
 

    QTreeWidgetItem* group2 = new QTreeWidgetItem(this);
    group2->setText(0,"group2");
	group2->setWhatsThis(0, "Group");
    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->setWhatsThis(0, "Device");
    subItem21->setCheckState(0,Qt::Unchecked);
 
    QTreeWidgetItem* subItem22 = new QTreeWidgetItem(group2);
    subItem22->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
    subItem22->setText(0,"subItem22");
	subItem22->setWhatsThis(0, "Device");
    subItem22->setCheckState(0,Qt::Unchecked);
 
    QTreeWidgetItem* subItem23 = new QTreeWidgetItem(group2);
    subItem23->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
    subItem23->setText(0,"subItem23");
	subItem23->setWhatsThis(0, "Device");
    subItem23->setCheckState(0,Qt::Unchecked);
	//this->setDragDropMode(QAbstractItemView::DragDrop);
	//this->setDragEnabled(true);


	//setDragEnabled(true);
	//this->setSelectionBehavior(QAbstractItemView::SelectRows);//选中行为为选中一行

	//connect(this, SIGNAL(updateParentItem(QTreeWidgetItem*, int)), this, SLOT(treeItemChanged(QTreeWidgetItem*, int)));
}

void TabTreeWidget::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 TabTreeWidget::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 TabTreeWidget::popMenu(const QPoint&)
{
	curItem = this->currentItem();  //获取当前被点击的节点
	if (curItem == NULL)
	{
		return;   //空白点击
	}
	else if (curItem->parent() == 0)
	{
		QPoint pos;
		QMenu menu(this);
		menu.addAction(QStringLiteral("删除"), this, SLOT(deleteItem()));
		menu.addAction(QStringLiteral("增加"), this, SLOT(testAddTreeNode()));
		menu.exec(QCursor::pos());  //当前鼠标位置显示
	}

	else 
	{
		QPoint pos;
		QMenu menu(this);
		menu.addAction(QStringLiteral("删除"), this, SLOT(deleteItem()));
		menu.addAction(QStringLiteral("增加"), this, SLOT(testAddTreeNode()));
		menu.exec(QCursor::pos());  //当前鼠标位置显示
		
	}
}

void TabTreeWidget::deleteItem()
{
	QTreeWidgetItem *curritem = this->currentItem();
	if (curritem != NULL)
	{
		QTreeWidgetItem *curritemparent = curritem->parent();
		if (curritemparent == NULL)
		{
			int index = this->indexOfTopLevelItem(curritem);
			if (index != -1)
			{
				this->takeTopLevelItem(index);
			}
		}
		else
		{
			int countChild = curritemparent->childCount();
			for (int i = 0; i < countChild; i++)
			{
				if (curritemparent->child(i) == curritem)
				{
					curritemparent->takeChild(i);
					break;
				}
			}
		}

	}
}
//测试按钮用
void TabTreeWidget::testAddTreeNode()
{
	QTreeWidgetItem *rootItem = this->invisibleRootItem(); //树的根节点
	int countGroup = rootItem->childCount();
	if (countGroup <= 0)  //列表树没有项
	{
		QTreeWidgetItem* subItem = new QTreeWidgetItem(this);
		subItem->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
		subItem->setText(0, "testG");
		subItem->setWhatsThis(0, "Group");
		subItem->setCheckState(0, Qt::Unchecked);
	}
	else {
		QTreeWidgetItem* subItem = new QTreeWidgetItem(curItem->parent());
		subItem->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
		subItem->setText(0, "testD");
		subItem->setWhatsThis(0, "Device");
		subItem->setCheckState(0, Qt::Unchecked);
	}

}
//接口
void TabTreeWidget::addTreeNode(QString name, QString gname)
{
	//gname区分组节点和子节点的,待定用不用  暂用Group  和  Device
	QTreeWidgetItem *rootItem = this->invisibleRootItem(); //树的根节点
	int countGroup = rootItem->childCount();
	if (countGroup <= 0)  //列表树没有项
	{
		QTreeWidgetItem* subItem = new QTreeWidgetItem(this);
		subItem->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
		subItem->setText(0, name);
		subItem->setWhatsThis(0, "Group");
		subItem->setCheckState(0, Qt::Unchecked);
	}
	else {
		QTreeWidgetItem* subItem = new QTreeWidgetItem(curItem->parent());
		subItem->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
		subItem->setText(0, name);
		subItem->setWhatsThis(0, "Device");
		subItem->setCheckState(0, Qt::Unchecked);
	}
	
}
//拖拽先不要,反正要了也没反应
//void TabTreeWidget::dragEnterEvent(QDragEnterEvent *event)
//{
//	QString strItemType = currentItem()->whatsThis(0);
//	if (strItemType != QStringLiteral("Device"))  //只能设备项能拖动,组节点和通道节点不能拖动
//	{
//		event->ignore();
//		return;
//	}
//
//	event->accept();
//}
//
//void TabTreeWidget::dragMoveEvent(QDragMoveEvent *event)
//{
//	QTreeWidgetItem *hittestItem = itemAt(event->pos());
//	if (hittestItem != NULL)
//	{
//		if (hittestItem != currentItem())
//		{
//			QString strItemType = hittestItem->whatsThis(0);
//			if (strItemType != QStringLiteral("Group"))
//			{
//				event->ignore();
//				return;
//			}
//		}
//
//		event->accept();
//	}
//	else
//	{
//		event->ignore();
//	}
//
//	//QTreeWidget::dragMoveEvent(event);
//}
//
//
//void TabTreeWidget::dropEvent(QDropEvent *event)
//{
//	QTreeWidgetItem *hittestItem = itemAt(event->pos());
//	if (hittestItem)
//	{
//		QString strItemType = hittestItem->whatsThis(0);
//		if (strItemType != QStringLiteral("Group"))
//		{
//			event->ignore();
//			return;
//		}
//	}
//
//	QTreeWidget::dropEvent(event);
//}

//添加组,先留着
void TabTreeWidget::newGroup()
{
	QTreeWidgetItem *newgroup = new QTreeWidgetItem(this);
	newgroup->setText(0, QStringLiteral("新建组"));
	newgroup->setWhatsThis(0, "Group");
	newgroup->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
	newgroup->setCheckState(0, Qt::Unchecked);
}

void TabTreeWidget::slotClickItem(QTreeWidgetItem* item, int col)
{
	QString checkState1;
	if (item->checkState(col) == Qt::Checked)
	{
		checkState1 = "true";
	}
	else {
		checkState1 = "false";
	}
	QString text = item->text(col);
	text = "name:" + text + "," + "checked:" + checkState1 + "," ;
	QMessageBox::warning(this, "Warning", QString("<font size='26' color='red'>%1</font>").arg(text));
	
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值