公司项目用到的,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));
}