QT::QTreeWidgetTest操作
前言:
本文操作均为在vs2015+QT5.9.5版本中执行
头文件:qtablewidgettest.h
#pragma once
#include <QtWidgets/QWidget>
#include "ui_qtreewidgettest.h"
class QTreeWidgetTest : public QWidget
{
Q_OBJECT
public:
QTreeWidgetTest(QWidget *parent = Q_NULLPTR);
public slots:
//鼠标点击
void ItemClicked(QTreeWidgetItem*item);
//鼠标双击
void ItemDoubleClicked(QTreeWidgetItem*item);
//鼠标移动事件
void ItemEntered(QTreeWidgetItem*item);
//鼠标修改事件
void ItemExpanded(QTreeWidgetItem*item);
private:
Ui::QTreeWidgetTestClass ui;
};
UI文件:ui_qtablewidgettest.h
/********************************************************************************
** Form generated from reading UI file 'qtreewidgettest.ui'
**
** Created by: Qt User Interface Compiler version 5.9.5
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/
#ifndef UI_QTREEWIDGETTEST_H
#define UI_QTREEWIDGETTEST_H
#include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QTreeWidget>
#include <QtWidgets/QWidget>
QT_BEGIN_NAMESPACE
class Ui_QTreeWidgetTestClass
{
public:
QTreeWidget *treeWidget;
void setupUi(QWidget *QTreeWidgetTestClass)
{
if (QTreeWidgetTestClass->objectName().isEmpty())
QTreeWidgetTestClass->setObjectName(QStringLiteral("QTreeWidgetTestClass"));
QTreeWidgetTestClass->resize(1064, 720);
treeWidget = new QTreeWidget(QTreeWidgetTestClass);
QTreeWidgetItem *__qtreewidgetitem = new QTreeWidgetItem(treeWidget);
QTreeWidgetItem *__qtreewidgetitem1 = new QTreeWidgetItem(__qtreewidgetitem);
new QTreeWidgetItem(__qtreewidgetitem1);
new QTreeWidgetItem(treeWidget);
treeWidget->setObjectName(QStringLiteral("treeWidget"));
treeWidget->setGeometry(QRect(90, 90, 781, 501));
treeWidget->setStyleSheet(QString::fromUtf8("QTreeWidget{\n"
" \n"
" background-color:rgb(244, 249, 250);\n"
" alternate-background-color: rgb(170, 255, 255);\n"
"}\n"
"/*Item\347\247\273\345\212\250\344\270\212\345\216\273\345\220\216\346\225\210\346\236\234*/\n"
"QTreeWidget::Item:hover{\n"
" background-color:#C5DAFF;\n"
"}\n"
"/*Item\351\200\211\344\270\255\345\220\216\346\225\210\346\236\234*/\n"
"QTreeWidget::Item:selected{\n"
" background-color:#DEBBE8;\n"
"}\n"
"/*\345\210\206\346\224\257\351\242\234\350\211\262\350\256\276\347\275\256*/\n"
"QTreeWidget::branch{\n"
" /* background-color: rgb(170, 255, 255);*/\n"
"}\n"
"/*\346\224\271\345\217\230\346\240\207\351\242\230\351\242\234\350\211\262*/\n"
"QHeaderView::section{\n"
" background-color: rgbs(57, 191, 194,200);\n"
" border: 1px solid rgb(244, 249, 250)\n"
"}"));
treeWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
treeWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
treeWidget->setAlternatingRowColors(true);
treeWidget->setSortingEnabled(false);
treeWidget->setAnimated(false);
treeWidget->header()->setDefaultSectionSize(100);
retranslateUi(QTreeWidgetTestClass);
QMetaObject::connectSlotsByName(QTreeWidgetTestClass);
} // setupUi
void retranslateUi(QWidget *QTreeWidgetTestClass)
{
QTreeWidgetTestClass->setWindowTitle(QApplication::translate("QTreeWidgetTestClass", "QTreeWidgetTest", Q_NULLPTR));
QTreeWidgetItem *___qtreewidgetitem = treeWidget->headerItem();
___qtreewidgetitem->setText(2, QApplication::translate("QTreeWidgetTestClass", "\346\226\260\345\273\272\345\210\2273", Q_NULLPTR));
___qtreewidgetitem->setText(1, QApplication::translate("QTreeWidgetTestClass", "\346\226\260\345\273\272\345\210\2272", Q_NULLPTR));
___qtreewidgetitem->setText(0, QApplication::translate("QTreeWidgetTestClass", "\346\226\260\345\273\272\345\210\2271", Q_NULLPTR));
const bool __sortingEnabled = treeWidget->isSortingEnabled();
treeWidget->setSortingEnabled(false);
QTreeWidgetItem *___qtreewidgetitem1 = treeWidget->topLevelItem(0);
___qtreewidgetitem1->setText(2, QApplication::translate("QTreeWidgetTestClass", "23", Q_NULLPTR));
___qtreewidgetitem1->setText(1, QApplication::translate("QTreeWidgetTestClass", "22", Q_NULLPTR));
___qtreewidgetitem1->setText(0, QApplication::translate("QTreeWidgetTestClass", "21", Q_NULLPTR));
QTreeWidgetItem *___qtreewidgetitem2 = ___qtreewidgetitem1->child(0);
___qtreewidgetitem2->setText(2, QApplication::translate("QTreeWidgetTestClass", "21.2", Q_NULLPTR));
___qtreewidgetitem2->setText(1, QApplication::translate("QTreeWidgetTestClass", "21.1", Q_NULLPTR));
___qtreewidgetitem2->setText(0, QApplication::translate("QTreeWidgetTestClass", "\346\226\260\345\273\272\345\255\220\351\241\271\347\233\2561", Q_NULLPTR));
QTreeWidgetItem *___qtreewidgetitem3 = ___qtreewidgetitem2->child(0);
___qtreewidgetitem3->setText(2, QApplication::translate("QTreeWidgetTestClass", "22.2", Q_NULLPTR));
___qtreewidgetitem3->setText(1, QApplication::translate("QTreeWidgetTestClass", "22.1", Q_NULLPTR));
___qtreewidgetitem3->setText(0, QApplication::translate("QTreeWidgetTestClass", "\346\226\260\345\273\272\345\255\220\351\241\271\347\233\2562", Q_NULLPTR));
QTreeWidgetItem *___qtreewidgetitem4 = treeWidget->topLevelItem(1);
___qtreewidgetitem4->setText(2, QApplication::translate("QTreeWidgetTestClass", "13", Q_NULLPTR));
___qtreewidgetitem4->setText(1, QApplication::translate("QTreeWidgetTestClass", "12", Q_NULLPTR));
___qtreewidgetitem4->setText(0, QApplication::translate("QTreeWidgetTestClass", "11", Q_NULLPTR));
treeWidget->setSortingEnabled(__sortingEnabled);
} // retranslateUi
};
namespace Ui {
class QTreeWidgetTestClass: public Ui_QTreeWidgetTestClass {};
} // namespace Ui
QT_END_NAMESPACE
#endif // UI_QTREEWIDGETTEST_H
主函数:main.cpp
#include "qtreewidgettest.h"
#include <QtWidgets/QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTreeWidgetTest w;
w.show();
return a.exec();
}
实现文件:qtablewidgettest.cpp
#include "qtreewidgettest.h"
#include <QDebug>
#include <QPushButton>
/*
单词汇总:
Top Level Item(顶部 水平 节点)
clear data(清理 数据)
header Item(头部 标题)
set Animated(设置 动画)
add Child(添加 子节点)
*/
QTreeWidgetTest::QTreeWidgetTest(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
//TreeWidget控件属性设置
/***********************************************************************************/
//排序
ui.treeWidget->setSortingEnabled(true);
//开启折叠动画
ui.treeWidget->setAnimated(true);
//设置标题宽度大小
ui.treeWidget->header()->setDefaultSectionSize(200);
//设置垂直滚动条一直显示
ui.treeWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
//设置水平滚动条关闭
ui.treeWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
//打开鼠标追踪
ui.treeWidget->setMouseTracking(true);
//打开交替行颜色
ui.treeWidget->setAlternatingRowColors(true);
/***********************************************************************************/
//清理标题以及数据
//清理标题方法:
//不可行方案:
//ui.treeWidget->setColumnCount(0);//这样清理并不会清空标题以及数据,只会造成隐藏标题以及数据。
//可执行方案:
ui.treeWidget->setHeaderItem(new QTreeWidgetItem());//此方法是重新创建标题,会替换掉之前的标题内容
ui.treeWidget->clear();//清理数据(clear data);
//“添加标题”及其“插入数据”方法:
//添加标题方法:
//PS:setColumnCount(0)用这个方法去添加标题,不会影响接下来的添加标题方法;
ui.treeWidget->setColumnCount(3);//测试是否影响下列添加数据
ui.treeWidget->headerItem()->setText(0, QString::fromLocal8Bit("标题1"));
//中间空出来位置会自动填充一个标题;
ui.treeWidget->headerItem()->setText(1, QString::fromLocal8Bit("标题2"));
ui.treeWidget->headerItem()->setText(2, QString::fromLocal8Bit("标题3"));
ui.treeWidget->headerItem()->setText(3, QString::fromLocal8Bit("标题4"));
//ui.treeWidget->headerItem()->setText(4, QString::fromLocal8Bit("标题5"));
qDebug() << "setColumnCount:" << ui.treeWidget->columnCount();//测试结果:不会影响headerItem()添加方法
//插入数据
ui.treeWidget->addTopLevelItem(new QTreeWidgetItem()); //设置一个顶部节点;PS: 代码中Top是指顶部节点。
//添加节点
/*
topLevelItem(子节点下标)
setText(标题下标 , "名称(name)")
*/
ui.treeWidget->topLevelItem(0)->setText(0, "tree node 1");
ui.treeWidget->topLevelItem(0)->setText(1, "tree node 2");
ui.treeWidget->topLevelItem(0)->setText(2, "tree node 3");
ui.treeWidget->topLevelItem(0)->setText(3, "tree node 4");
//插入到结尾处,利用数组初始化两个节点。
//定义:void addTopLevelItem(QTreeWidgetItem *item);
ui.treeWidget->addTopLevelItem(new QTreeWidgetItem({ "tree node 2-1 coll","tree node 2-2 col2" }));
ui.treeWidget->topLevelItem(1)->setText(2, "tree node 2-3");//一定要先添加“addTopLevelItem”后才能添加节点
//插入到第一行
ui.treeWidget->insertTopLevelItem(0, new QTreeWidgetItem({ "insert tree node one","insert tree node tow" }));
//插入到最后一行
ui.treeWidget->insertTopLevelItem(ui.treeWidget->topLevelItemCount(), new QTreeWidgetItem());
//topLevelItemCount()获取总数,从1开始,不是从0开始。
ui.treeWidget->topLevelItem(ui.treeWidget->topLevelItemCount()-1)->setText(0, "end tree node 1");
//创建一个新的一列QTreeWidgetItem节点,也是尾部添加,似乎没有函数可以修改插入位置
QTreeWidgetItem *node = new QTreeWidgetItem(ui.treeWidget);
node->setText(0,"new node 1");
//插入孩子节点;
//添加子节点(addChild)
//PS:ui.treeWidget->topLevelItem(列)->addChild(new QTreeWidgetItem({ "名称"}));
ui.treeWidget->topLevelItem(0)->addChild(new QTreeWidgetItem({ "Child_1" ,"Child_2","Child_3","Child_4" }));
ui.treeWidget->topLevelItem(0)->addChild(new QTreeWidgetItem({ "Child_2" }));
ui.treeWidget->topLevelItem(0)->addChild(new QTreeWidgetItem({ "Child_3" }));
//添加子节点到第二行
ui.treeWidget->topLevelItem(1)->addChild(new QTreeWidgetItem({ "Child_1_1" ,"Child_1_2","Child_1_3","Child_1_4" }));
ui.treeWidget->topLevelItem(1)->addChild(new QTreeWidgetItem({ "Child_1_2" }));
ui.treeWidget->topLevelItem(1)->addChild(new QTreeWidgetItem({ "Child_1_3" }));
//插入孙子节点:先找到第几列插入->找到第几行插入->插入孙子节点
//PS:ui.treeWidget->topLevelItem(列)->child(行)->addChild(new QTreeWidgetItem({ "名称" }));
ui.treeWidget->topLevelItem(0)->child(0)->addChild(new QTreeWidgetItem({ "grandson_1" }));
//插入图片
ui.treeWidget->setIconSize(QSize(60, 60));//设置图片大小
ui.treeWidget->topLevelItem(0)->setText(0,"");//清空内容
ui.treeWidget->topLevelItem(0)->setIcon(0, QIcon("five.png"));//插入图片
//添加按钮
QPushButton *but = new QPushButton("but1");//创建一个按钮
//插入按钮:setItemWidget(位置, 行号,QWidget(控件) );
ui.treeWidget->setItemWidget(ui.treeWidget->topLevelItem(1), 0,but );
//PS:子节点除了第一列可以添加QPushButton,第二列只能添加Icon
ui.treeWidget->topLevelItem(1)->child(0)->setIcon(1, QIcon("five.png"));
//信号与槽绑定
//鼠标单击事件
connect(ui.treeWidget, SIGNAL(itemClicked(QTreeWidgetItem*, int)), this, SLOT(ItemClicked(QTreeWidgetItem*)));
//鼠标双击事件
connect(ui.treeWidget, SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)), this, SLOT(ItemDoubleClicked(QTreeWidgetItem*)));
//鼠标悬浮到节点自动打开展开子节点事件
connect(ui.treeWidget, SIGNAL(itemEntered(QTreeWidgetItem*,int)), this, SLOT(ItemEntered(QTreeWidgetItem*)));
//鼠标单击项目展开子节点事件
connect(ui.treeWidget, SIGNAL(itemExpanded(QTreeWidgetItem*)), this, SLOT(ItemExpanded(QTreeWidgetItem*)));
}
void QTreeWidgetTest::ItemClicked(QTreeWidgetItem*item)
{
qDebug() << "Clicked" << item->text(0);
}
void QTreeWidgetTest::ItemDoubleClicked(QTreeWidgetItem*item)
{
qDebug() << "DoubleClicked" << item->text(0);
}
//鼠标移动到节点自动展开子节点
void QTreeWidgetTest::ItemEntered(QTreeWidgetItem*item)
{
qDebug() << "Hover" << item->text(0);
//ui.treeWidget->expandItem(item);//打开子节点
}
void QTreeWidgetTest::ItemExpanded(QTreeWidgetItem*item)
{
qDebug() << "Expanded" << item->text(0);
//判断childCount()>0;节点总数大于0
while(item->childCount()>0)
{
//清空节点
item->removeChild(item->child(0));
}
//创建新的子节点
item->addChild(new QTreeWidgetItem({ "one 1" }));
item->addChild(new QTreeWidgetItem({ "one 2" }));
item->addChild(new QTreeWidgetItem({ "one 3" }));
}
ui界面布局样式:
样式表:
treeWidget样式表:
QTreeWidget{
background-color:rgb(244, 249, 250);
alternate-background-color: rgb(170, 255, 255);
}
/*Item移动上去后效果*/
QTreeWidget::Item:hover{
background-color:#C5DAFF;
}
/*Item选中后效果*/
QTreeWidget::Item:selected{
background-color:#DEBBE8;
}
/*分支颜色设置*/
QTreeWidget::branch{
/* background-color: rgb(170, 255, 255);*/
}
/*改变标题颜色*/
QHeaderView::section{
background-color: rgbs(57, 191, 194,200);
border: 1px solid rgb(244, 249, 250)
}