QTreeWidget使用
为什么不能通过这篇文章,直接玩转 QTreeWidget
树桩窗体呢?
简介
操作系统:window7 x64
编程IDE:Qt Creator 4.2.1
Qt版本:5.8.0
最后更新日期:2017年5月3日
版权所有:_OE_, 转载请注明出处:http://blog.****.net/csnd_ayo
基础
这里只负责基础的内容,最浅显,最常用的内容。
树状列表的创建
-
关联
该类的关联头文件, 别觉得谁都知道,有不知道的人,我说真的。
#include <QTreeWidget>
- 1
光膀子的列表
包含了头文件以后,我们通过下面的这句话就可以建出一个啥也没有的列表了,虽然这个列表看起来还很可笑。
QTreeWidget* tree = new QTreeWidget();
tree->show();
- 1
- 2
别瞧他现在还是个四不像,这胚子已经出来了,树状列表还远吗?
这里的 1
是这个树状图的标题,我们暂时先不用理会他。
穿上列表的衣服
我们来认识下一个至关重要的类。
QTreeWidgetItem
显然他的名字就已经说明了他的作用,我们想要插入一条一条的数据都要通过这个类。
/**
* @brief : 构造函数 - 生成一个子项
* @param : view 关联的窗体,或译父节点
* @param : strings 列(column)数据 (后面会细讲)
* @param : type 暂时不用理会
*/
QTreeWidgetItem(QTreeWidget *view,
const QStringList &strings, int type = Type);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
我们来建立我们自己的列表
QTreeWidget* tree = new QTreeWidget();
tree->show();
//添加一级节点
QTreeWidgetItem *items1 = new QTreeWidgetItem(tree,
QStringList(QString("num_1")));
QTreeWidgetItem *items2 = new QTreeWidgetItem(tree,
QStringList(QString("num_2")));
QTreeWidgetItem *items3 = new QTreeWidgetItem(tree,
QStringList(QString("num_3")));
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
我们的树列就有了,一个for,我们想有多少行就有多少行了。
至此,基础的列表显示就已经齐全了。
树状列表的删除
-
野蛮的 delete
树状列表的删除其实很有趣,一个 delete
就搞定了,尽管这样很不优雅。
原因也很简单,一个 delete
触发了析构函数。
我说他野蛮的原因是,我们不可能在程序复杂的运行过程中还保留曾经的变量 items2 item3….
所以这样的写法,只能被看成野蛮,无脑。
如何优雅?
QTreeWidget* tree = new QTreeWidget();
tree->show();
//添加一级节点
QTreeWidgetItem *items1 = new QTreeWidgetItem(tree,
QStringList(QString("num_1")));
QTreeWidgetItem *items2 = new QTreeWidgetItem(tree,
QStringList(QString("num_2")));
QTreeWidgetItem *items3 = new QTreeWidgetItem(tree,
QStringList(QString("num_3")));
tree->takeTopLevelItem(1);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
嘿嘿,这里的函数名 takeTopLevelItem
已经阐述了他的作用,拿走顶级的项。
index 是下标,我们这里给了 1
你们可以想想,这里哪个子项会消失。
最常用的删除
我们一般删除某个项,都是由用户通过鼠标指定的,所以我们其实可以通过相应特定的事件(例:右键菜单,delete keydown)。
// 通过这个函数获得当前选中的项
QTreeWidget* tree = new QTreeWidget();
tree->currentItem();
- 1
- 2
- 3
若currentItem 返回空,则意味着没有选中该列表中的子项。
树状图的查找
-
众里寻他千百度 删他只需一抽搐
QTreeWidget* tree = new QTreeWidget();
tree->show();
//添加一级节点
QTreeWidgetItem *items1 = new QTreeWidgetItem(tree,
QStringList(QString("num_1")));
QTreeWidgetItem *items2 = new QTreeWidgetItem(tree,
QStringList(QString("num_1")));
QTreeWidgetItem *items3 = new QTreeWidgetItem(tree,
QStringList(QString("num_3")));
// 查找 与 num_1 完全一致的项,并返回。
QList<QTreeWidgetItem*> s = tree->findItems("num_1", Qt::MatchFlag::MatchExactly);
// 无情删除
for (auto item : s) {
delete item;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
深入
多级树状图
多级树状图,其实也很好理解,就是把父节点换掉嘛,谁是父节点,那么Item项就挂载在谁的下面。
QTreeWidgetItem *items3 = new QTreeWidgetItem(tree,
QStringList(QString("num_13")));
QTreeWidgetItem *item104 = new QTreeWidgetItem(items3,
QStringList(QString("item104")));
- 1
- 2
- 3
- 4
- 5
层次都是按照这个套路来的,多级树状图油然而生。
多列树状图
暂无信息
- 1
简单的自定义
使用这个函数的时候,需要在全局或类内定义一个变量 QMap<QString, QTreeWidgetItem*> itemMap_
, 他记录着所有树列的唯一键值,记住是唯一。
/**
* @brief : 添加子项到树中
* @param : item 项的内容
* @param : parentKey 他的父级节点的唯一标识
* @param : theKey 他的节点唯一标识
*/
int CustomTreeWidget::addItem(QStringList item, QString parentKey, QString theKey) {
QTreeWidgetItem* temp_item;
/// 生成到父级节点下
QMap<QString,QTreeWidgetItem*>::iterator iter_item = itemMap_.find(parentKey);
if (iter_item == itemMap_.end()) {
temp_item = new QTreeWidgetItem(this, item);
}
else {
temp_item = new QTreeWidgetItem(iter_item.value(), item);
}
/// 判断
if (!theKey.isEmpty()) {
itemMap_.insert(theKey,temp_item);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
这里只是简单的给大家一个思路,大家放胆去继承QTreeWidget类,发挥想象读取干吧。
比如通过某个值获得这个项,结合上面的基础,已经可以做很多事情啦,不是吗?
列表头的操作
- 表头操作
/**
* @brief : 表头的隐藏
* @param : hide [true : 隐藏表头 false : 显示表头]
*/
void QTreeView::setHeaderHidden(bool hide);
- 1
- 2
- 3
- 4
- 5
- 设置表头
/**
* @brief : 设置表头内容
* @param : item 具体的item项
*/
void QTreeView::setHeaderItem(QTreeWidgetItem *item);
// 也可以直接给文字
void setHeaderLabels(const QStringList &labels);
inline void setHeaderLabel(const QString &label);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
会说话的颜色
QStringList head;
head << "姓名";
QTreeWidget* tree = new QTreeWidget();
tree->show();
// 设置表头
tree->setHeaderLabels(head);
// 添加一级节点
head.clear();
head << "王根基";
QTreeWidgetItem *items1 = new QTreeWidgetItem(tree,
head);
head.clear();
head << "李大锤";
QTreeWidgetItem *items3 = new QTreeWidgetItem(tree,
head);
/// 设置背景颜色
items3->setBackground(0,QBrush(Qt::green));
head.clear();
head << "李思基(非亲生)";
QTreeWidgetItem *item104 = new QTreeWidgetItem(items3,
head);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
太晚了,这里还没有更新,抱歉。
为子项添加Logo
暂无介绍
- 1
QTreeWidget 的新装
暂无介绍
- 1
<link href="https://****img.cn/release/phoenix/mdeditor/markdown_views-7b4cdcb592.css" rel="stylesheet">
</div>