ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[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<QTreeWidgetItem *> & items) //添加多个顶级条目到末尾 // 添加到指定顶级条目 void QTreeWidget::​insertTopLevelItem(int index, QTreeWidgetItem * item) void QTreeWidget::​insertTopLevelItems(int index, const QList<QTreeWidgetItem *> & 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<QTreeWidgetItem *> 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; } ```