QTreeWidget
最后更新于:2022-04-02 02:11:04
[TOC]
## 概述
![](https://qtguide.ustclug.org/images/ch08/ch08-03-23.png)
或
![](https://qtguide.ustclug.org/images/ch08/ch08-03-03.png)
1. 默认的列数是 1 列,
2. 如果涉及到多列数据,比如文件浏览树,有文件名、文件类型、大小、修改时间等等,就需要设置为多列数据的树
常用函数
```
QTreeWidget(QWidget * parent = 0)
// 必须设置列数
void setColumnCount(int columns) //设置列数
int columnCount() const //获取列数
// 默认的列数是 1 列,如果涉及到多列数据,比如文件浏览树,有文件名、文件类型、大小、修改时间等等,就需要设置为多列数据的树
// 添加和访问顶级条目
void QTreeWidget::addTopLevelItem(QTreeWidgetItem * item) //添加一个顶级条目到末尾
void QTreeWidget::addTopLevelItems(const QList & items) //添加多个顶级条目到末尾
// 添加到指定顶级条目
void QTreeWidget::insertTopLevelItem(int index, QTreeWidgetItem * item)
void QTreeWidget::insertTopLevelItems(int index, const QList & items)
// 移除顶级条目
QTreeWidgetItem * QTreeWidget::takeTopLevelItem(int index)
void QTreeWidget::clear() // 清空所有的顶级条目和子条目
// 条目访问函数
QTreeWidgetItem * QTreeWidget::topLevelItem(int index) const
int QTreeWidget::indexOfTopLevelItem(QTreeWidgetItem * item) const
// 访问相邻条目,可能同级,父级或是子级
QTreeWidgetItem * QTreeWidget::itemAbove(const QTreeWidgetItem * item) const //上面相邻条目
QTreeWidgetItem * QTreeWidget::itemBelow(const QTreeWidgetItem * item) const //下面相邻条目
// 当前条目的操作
QTreeWidgetItem * QTreeWidget::currentItem() const
int QTreeWidget::currentColumn() const // 多航顶级条目时返回选中的
// 设置某个条目为当前选中的状态
void QTreeWidget::setCurrentItem(QTreeWidgetItem * item)
void QTreeWidget::setCurrentItem(QTreeWidgetItem * item, int column)
void QTreeWidget::setCurrentItem(QTreeWidgetItem * item, int column, QItemSelectionModel::SelectionFlags command)
// 条目查找
QList QTreeWidget::findItems(const QString & text, Qt::MatchFlags flags, int column = 0) const
// 排序
bool isSortingEnabled() const //设置是否自动排序
void setSortingEnabled(bool enable) //查看是否开启自动排序
void QTreeView::sortByColumn(int column, Qt::SortOrder order) // 指定某行排序
//条目显示和运行时条目编辑
//可以为条目的某列“单元格”设置单独的控件来静态显示(控件不具有编辑功能)
void QTreeWidget::setItemWidget(QTreeWidgetItem * item, int column, QWidget * widget) //设置条目列控件
QWidget * QTreeWidget::itemWidget(QTreeWidgetItem * item, int column) const //获取条目列控件,不设置就是NULL
// 删除条目控件
void QTreeWidget::removeItemWidget(QTreeWidgetItem * item, int column)
// 选中行为和选中模式
QAbstractItemView::SelectionBehavior selectionBehavior() const //获取选中行为,按条目选中、整行或整列选中
void setSelectionBehavior(QAbstractItemView::SelectionBehavior behavior) //设置选中行为
QAbstractItemView::SelectionMode selectionMode() const //获取选中模式,比如单选、多选、扩展选择
void setSelectionMode(QAbstractItemView::SelectionMode mode) //设置选中模式
```
## 树头条目
```
void QTreeWidget::setHeaderItem(QTreeWidgetItem * item) //设置树头条目,树头条目可以有多列数据,相当于多列的表头一次性设置了
void QTreeWidget::setHeaderLabel(const QString & label) //只设置第 0 列的表头
void QTreeWidget::setHeaderLabels(const QStringList & labels) //设置多列的表头
QTreeWidgetItem * QTreeWidget::headerItem() const //获取树头条目
```
树头条目本质其实也是由 QHeaderView 子控件来显示的
```
QHeaderView * QTreeView::header() const //获取表头视图控件
void QTreeView::setHeader(QHeaderView * header) //设置表头视图, 一般树形控件不需要用这个函数
void QTreeView::setHeaderHidden(bool hide) //设置表头是否隐藏
bool QTreeView::isHeaderHidden() const //判断是否隐藏了表头
```
## 示例
### 初始化
```
ui->setupUi(this);
//设置树形控件只有 1 列
ui->treeWidget->setColumnCount( 1 );
//创建A条目,添加到顶级条目
QTreeWidgetItem *itemA = new QTreeWidgetItem();
itemA->setText(0, "A");
ui->treeWidget->addTopLevelItem(itemA);
//创建 B、C条目,添加给 A
QTreeWidgetItem *itemB = new QTreeWidgetItem();
itemB->setText(0, "B");
itemA->addChild( itemB );
//创建D、E条目,构造函数指定父条目为 B,自动设置父子关系
QTreeWidgetItem *itemD = new QTreeWidgetItem(itemB);
itemD->setText(0, "D");
//设置树形控件2列
//ui->treeWidget->setColumnCount( 2 );
//各列均匀拉伸
ui->treeWidget->header()->setSectionResizeMode(QHeaderView::Stretch);
//展开所有子孙节点
ui->treeWidget->expandAll();
// 方式二:添加item
//树形控件构造条目
for(int i=0; i<5; i++)
{
QTreeWidgetItem *itemT = new QTreeWidgetItem( ui->treeWidget );
itemT->setText(0, tr("treeItem %1, 0").arg(i) );
itemT->setText(1, tr("t%1, 1").arg(i) );
}
```
### 双击修改
```
// 添加信号
connect(view,&QTreeWidget::itemDoubleClicked,this,&MainWindow::itemDoubleClicked);
// 处理函数
// 双击修改
void MainWindow::itemDoubleClicked(QTreeWidgetItem *item, int column)
{
qDebug()<< column;
item->setFlags(item->flags()|Qt::ItemIsEditable);
view->editItem(item,column);
}
```
### 设置三态复选框
```
// 迭代器
QTreeWidgetItemIterator it(ui->treeWidget);
while (*it)
{
//取出当前条目
QTreeWidgetItem *item = *it;
if(item->childCount() > 0 )//有子节点开启三态复选,没子节点是二态复选
{
item->setFlags( item->flags() | Qt::ItemIsTristate );
}
item->setCheckState(0, Qt::Unchecked); //正常应该只用第0列的复选框,代表一整行条目
//找下一个条目
++it;
}
```
';