树形控件的节点可以有多层、多个子节点, 如果将子节点全部展开,那么每一行都是一个数据条目。QTreeWidgetItem 比较特殊,一个条目内部可以有多列数据信息,相当于表格控件一整行的表格单元集成为一个条目。
默认情况下,树形控件最上面是一个树头条目,树头条目也是 QTreeWidgetItem 对象,可以有多列内容。
树头下面是真正的树形控件所有条目,在折叠的情况下,如上图所示,每行一个顶级条目,顶级条目也是 QTreeWidgetItem 对象,顶级条目的父节点指针 QTreeWidgetItem::parent() 为 NULL。
QTreeWidget
顶级条目进行计数
int QTreeWidget::topLevelItemCount() const
获取顶级条目
QTreeWidgetItem *topLevelItem(int index) const;
添加顶级条目
void addTopLevelItem(QTreeWidgetItem *item);
移除顶级条目
QTreeWidgetItem *takeTopLevelItem(int index);
清空所有的顶级条目和子条目
void clear();
获取当前高亮选中条目的函数为
QTreeWidgetItem *currentItem() const;
设置某个条目为当前选中的状态
void setCurrentItem(QTreeWidgetItem *item);
当前高亮选中的状态发生变化,会触发如下信号
void currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous);
QTreeWidgetItem
获取某列的数据
QString text(int column)
virtual QVariant data(int column, int role) const;
设置某列的数据
void setText(int column, const QString &text)
virtual void setData(int column, int role, const QVariant &value);
获取某列图标
inline QIcon icon(int column) const
设置某列图标
inline void setIcon(int column, const QIcon &icon);
添加子项
void addChild(QTreeWidgetItem *child);
void addChildren(const QList<QTreeWidgetItem*> &children);
当前条目的操作
QTreeWidgetItem *currentItem() const; //获取当前高亮选中条目
int currentColumn() const; //当前条目被点击选中的列号
void setCurrentItem(QTreeWidgetItem *item); //设置某个条目为当前选中的状态
常用的信号
如果当前高亮选中的状态发生变化
void currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous);
void itemActivated(QTreeWidgetItem * item, int column) //条目列被激活
void itemChanged(QTreeWidgetItem * item, int column) //条目列的数据发生变化,比如文本或图标修改了
void itemClicked(QTreeWidgetItem * item, int column) //条目列被单击
void itemDoubleClicked(QTreeWidgetItem * item, int column) //条目列被双击
void itemEntered(QTreeWidgetItem * item, int column) //进入条目列
void itemPressed(QTreeWidgetItem * item, int column) //条目列被点击按下
void QTreeWidget::itemExpanded(QTreeWidgetItem * item) //条目展开时发送信号
void QTreeWidget::itemCollapsed(QTreeWidgetItem * item) //条目折叠时发送信号
代码例子
#ifndef WIDGET_H#define WIDGET_H#include <QWidget>#include <QTreeWidget>QT_BEGIN_NAMESPACEnamespace Ui { class Widget; }QT_END_NAMESPACEclass Widget : public QWidget{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void createtree();QTreeWidget *tree;public slots:void curItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous);void itemselected(QTreeWidgetItem *item,int column);public:void setselected(QTreeWidgetItem *item,Qt::CheckState state);private:Ui::Widget *ui;};#endif // WIDGET_H#include "widget.h"#include "ui_widget.h"#include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget){ui->setupUi(this);createtree();}Widget::~Widget(){delete ui;}void Widget::createtree(){tree = new QTreeWidget(this);tree->resize(400, 300); // 设置控件大小为 400 x 300tree->move(100, 100); // 设置控件在窗口中的位置为 (100, 100)tree->setColumnCount(2); // 设置列数为 2tree->setHeaderLabels({"Name", "Value"}); // 设置列标题为 "Name" 和 "Value"QTreeWidgetItem *root = new QTreeWidgetItem(tree); // 创建一个根节点root->setText(0, "Root"); // 设置节点文本root->setText(1, "0"); // 设置节点文本root->setCheckState(0,Qt::Checked);tree->addTopLevelItem(root); // 将节点添加到 QTreeWidget 中QTreeWidgetItem *child1 = new QTreeWidgetItem(root); // 创建一个子节点child1->setText(0, "Child 1"); // 设置节点文本child1->setText(1,"10"); // 设置节点文本''child1->setCheckState(0,Qt::Checked);root->addChild(child1); // 将节点添加到根节点下QTreeWidgetItem *child11 = new QTreeWidgetItem(child1); // 创建一个子节点child11->setText(0, "Child 11"); // 设置节点文本child11->setText(1,"100"); // 设置节点文本''child11->setCheckState(0,Qt::Checked);child1->addChild(child11); // 将节点添加到根节点下QTreeWidgetItem *child2 = new QTreeWidgetItem(root); // 创建一个子节点child2->setText(0, "Child 2"); // 设置节点文本child2->setText(1,"20"); // 设置节点文本child2->setCheckState(0,Qt::Checked);root->addChild(child2); // 将节点添加到根节点下connect(tree,SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem*)),this,SLOT(curItemChanged(QTreeWidgetItem *, QTreeWidgetItem*)));connect(tree,SIGNAL(itemClicked(QTreeWidgetItem *,int)),this,SLOT(itemselected(QTreeWidgetItem *,int)));tree->show();}void Widget::curItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous){if(current != nullptr){qDebug() << current->text(0);}}void Widget::itemselected(QTreeWidgetItem *item,int column){if(column == 0){Qt::CheckState state = item->checkState(0);if(state == Qt::Checked || state == Qt::Unchecked){setselected(item,state);}}}void Widget::setselected(QTreeWidgetItem *item,Qt::CheckState state ){int ncount = item->childCount();for(int i = 0; i <ncount; i++){QTreeWidgetItem *child = item->child(i);child->setCheckState(0,state);if(child->childCount() > 0)setselected(child,state);}}