文章目录
- 1. QListWidget
- 1.1 常用属性和方法
- 1.2 常用信号
- 1.4 例子1,操作元素
- 2. QTableWidget
- 2.1 常用属性和方法
- 2.2 常用信号
- 2.3 例子1,创建表格
- 3.1 常用属性和方法
- 3.2 常用信号
- 3.3 例子1,创建树形结构
Qt中提供的多元素控件有:
QListWidget
QListView
QTableWidget
QTableView
QTreeWidget
QTreeView
xxWidget
和xxView
之间的区别:
xxWidget
xxWidget
属于便捷类控件,它将数据存储和显示逻辑集成在一起,提供了一种简单直接的方式来创建和管理表格、树形结构等界面元素。开发者无需过多关注数据模型的设计,就能快速搭建出具有基本功能的界面。(简单,但是拓展性低)
xxView
xxView
基于模型 - 视图 - 控制器(MVC)架构设计,遵循分离原则,将数据的存储(模型)和显示(视图)分离开来。这种设计使得数据和界面的管理更加灵活,方便进行数据的修改、扩展和复用。(复杂,但是拓展性高)
1. QListWidget
QListWidget
表示一个纵向的列表
1.1 常用属性和方法
属性
属性 | 说明 | 类型 | 读写性 | 取值范围或可能值 |
---|---|---|---|---|
currentRow | 表示当前被选中的行的索引,索引从 0 开始计数。通过该属性可以获取当前选中行的位置,也可以设置选中某一行。 | int | 读写 | 取值范围为 -1 到 count - 1 ,-1 表示没有选中任何行。 |
count | 指示 QListWidget 中一共存在的行数,也就是列表项的数量。可以使用该属性获取列表的大小。 | int | 只读 | 大于等于 0 的整数 |
sortingEnabled | 决定是否允许对列表中的项进行排序。当设置为 true 时,用户可以通过某些操作(如点击表头)对列表项进行排序;设置为 false 时,列表项保持添加时的顺序。 | bool | 读写 | true 或 false |
isWrapping | 用于设置列表项是否允许换行显示。若设置为 true ,当列表项的内容过长时,会自动换行显示;设置为 false 时,内容会以单行显示,超出部分可能会被截断。 | bool | 读写 | true 或 false |
itemAlignment | 定义列表项中文本或元素的对齐方式,例如左对齐、右对齐、居中对齐等。可以根据需要调整列表项内容的显示位置。 | Qt::Alignment | 读写 | 常见取值如 Qt::AlignLeft 、Qt::AlignRight 、Qt::AlignCenter 等 |
selectRectVisible | 控制被选中的元素的矩形边框是否可见。设置为 true 时,选中的列表项会显示一个矩形边框以突出显示;设置为 false 时,不显示该边框。 | bool | 读写 | true 或 false |
spacing | 指定列表中各个元素(列表项)之间的间隔大小。通过调整该属性,可以改变列表项之间的间距,从而影响列表的布局和外观。 | int | 读写 | 大于等于0的整数 |
方法
方法 | 方法原型 | 说明 | 参数 | 返回值 |
---|---|---|---|---|
addItem | void addItem(const QString &label) void addItem(QListWidgetItem *item) | 向列表中添加元素。第一个重载方法接受一个字符串作为元素的文本标签;第二个重载方法接受一个 QListWidgetItem 对象指针,可以自定义元素的属性(如图标、字体等)。 | 1. const QString &label :要添加元素的文本标签。 2. QListWidgetItem *item :要添加的 QListWidgetItem 对象指针。 | void |
currentItem | QListWidgetItem *currentItem() const | 返回当前选中的元素。返回的是一个 QListWidgetItem 对象指针,可以通过该指针访问和修改选中元素的属性。 | 无 | QListWidgetItem * :当前选中的元素指针,若没有选中元素则返回 nullptr 。 |
setCurrentItem | void setCurrentItem(QListWidgetItem *item) | 设置选中哪个元素。将指定的 QListWidgetItem 对象设置为当前选中元素。 | QListWidgetItem *item :要设置为选中状态的元素指针。 | void |
setCurrentRow | void setCurrentRow(int row) | 设置选中第几行的元素。通过行索引来指定要选中的元素。 | int row :要选中元素的行索引,索引从 0 开始。 | void |
insertItem | void insertItem(int row, const QString &label) void insertItem(int row, QListWidgetItem *item) | 在指定的位置插入元素。第一个重载方法接受一个行索引和一个字符串标签,将带有该标签的元素插入到指定行;第二个重载方法接受一个行索引和一个 QListWidgetItem 对象指针,将该对象插入到指定行。 | 1. int row :要插入元素的行索引。 2. const QString &label :要插入元素的文本标签。 3. QListWidgetItem *item :要插入的 QListWidgetItem 对象指针。 | void |
item | QListWidgetItem *item(int row) const | 返回指定行的元素。通过行索引获取对应行的 QListWidgetItem 对象指针。 | int row :要获取元素的行索引,索引从 0 开始。 | QListWidgetItem * :指定行的元素指针,若行索引超出范围则返回 nullptr 。 |
takeItem | QListWidgetItem *takeItem(int row) | 删除指定行的元素,并返回被删除的元素指针。删除后,该元素不再属于 QListWidget ,但指针仍然有效,需要手动管理其内存。 | int row :要删除元素的行索引,索引从 0 开始。 | QListWidgetItem * :被删除的元素指针,若行索引超出范围则返回 nullptr 。 |
1.2 常用信号
信号 | 信号原型 | 说明 | 参数 |
---|---|---|---|
currentItemChanged | void currentItemChanged(QListWidgetItem *current, QListWidgetItem *old) | 当选中的元素发生改变时触发该信号。可用于在用户切换选中元素时执行相应的操作,比如更新其他界面元素显示选中元素的详细信息等。 | 1. QListWidgetItem *current :当前新选中的元素指针。 2. QListWidgetItem *old :之前被选中的元素指针。 |
currentRowChanged | void currentRowChanged(int currentRow) | 同样在选中的元素改变时触发,不过此信号传递的是当前选中元素所在的行号。适用于根据行号进行一些逻辑处理的场景。 | int currentRow :当前选中元素的行号,行号从 0 开始计数。 |
itemClicked | void itemClicked(QListWidgetItem *item) | 当用户点击列表中的某个元素时触发该信号。常用于实现点击元素后的特定操作,如打开一个新窗口显示元素详情等。 | QListWidgetItem *item :被点击的元素指针。 |
itemDoubleClicked | void itemDoubleClicked(QListWidgetItem *item) | 当用户双击列表中的某个元素时触发该信号。常见应用场景是通过双击元素执行一些更深入的操作,例如打开文件等。 | QListWidgetItem *item :被双击的元素指针。 |
itemEntered | void itemEntered(QListWidgetItem *item) | 当鼠标指针进入列表中的某个元素区域时触发该信号。可用于实现鼠标悬停效果,如改变元素的显示样式等。 | QListWidgetItem *item :鼠标进入的元素指针。 |
##1.3 QListWidgetItem
这个类表示QListWidget
的一个元素。下面是常用方法
方法 | 方法原型 | 说明 | 参数 | 返回值 |
---|---|---|---|---|
setFont | void setFont(const QFont &font) | 用于设置列表项的字体样式,包括字体的类型、大小、加粗、倾斜等属性。 | const QFont &font :一个 QFont 对象,包含了要设置的字体信息。 | void |
setIcon | void setIcon(const QIcon &icon) | 为列表项设置图标,图标会显示在列表项文本的旁边,增强列表项的可视化效果。 | const QIcon &icon :一个 QIcon 对象,代表要设置的图标。 | void |
setHidden | void setHidden(bool hide) | 控制列表项是否隐藏。当设置为 true 时,列表项将不可见;设置为 false 时,列表项正常显示。 | bool hide :true 表示隐藏列表项,false 表示显示列表项。 | void |
setSizeHint | void setSizeHint(const QSize &size) | 设置列表项的推荐尺寸,列表项会尽量按照指定的尺寸进行显示。这在需要自定义列表项大小的场景中很有用。 | const QSize &size :一个 QSize 对象,包含了列表项的宽度和高度信息。 | void |
setSelected | void setSelected(bool select) | 设置列表项是否处于选中状态。当设置为 true 时,列表项会被选中;设置为 false 时,列表项会取消选中状态。 | bool select :true 表示选中列表项,false 表示取消选中。 | void |
setText | void setText(const QString &text) | 用于设置列表项显示的文本内容。 | const QString &text :要设置的文本字符串。 | void |
setTextAlignment | void setTextAlignment(int alignment) | 设置列表项中文本的对齐方式,例如左对齐、右对齐、居中对齐等。 | int alignment :对齐方式的标志,可以使用 Qt::Alignment 枚举值,如 Qt::AlignLeft 、Qt::AlignRight 、Qt::AlignCenter 等。 | void |
1.4 例子1,操作元素
在Qt Designer
中设置基本框架
给两个按钮添加槽函数
void Widget::on_pushButton_add_clicked()
{QString text = ui->lineEdit->text();if(text == "" || text.size() == 0) {qDebug() << "Empty...";return;} else {ui->listWidget->addItem(text);}
}void Widget::on_pushButton_del_clicked()
{int row = ui->listWidget->currentRow();if(row == -1) {qDebug() << "Not even one row selected";return;} else {ui->listWidget->takeItem(row);}
}
运行结果如下
2. QTableWidget
QTableWidget
表示表格控件
2.1 常用属性和方法
属性具体见1.1
。有两个独有的属性columnCount
和rowCount
,分别表示表格列数和行数
下面是常用方法
方法 | 方法原型 | 说明 | 参数 | 返回值 |
---|---|---|---|---|
item | QTableWidgetItem *item(int row, int column) const | 根据指定的行和列获取表格中对应位置的 QTableWidgetItem 指针。若该位置没有元素,则返回 nullptr 。 | int row :行索引,从 0 开始计数。 int column :列索引,从 0 开始计数。 | QTableWidgetItem * :指定位置的 QTableWidgetItem 指针,若无则为 nullptr 。 |
setItem | void setItem(int row, int column, QTableWidgetItem *item) | 在指定的行和列位置设置一个 QTableWidgetItem 元素。若该位置已有元素,会被新元素替换。 | int row :行索引,从 0 开始计数。 int column :列索引,从 0 开始计数。 QTableWidgetItem *item :要设置的 QTableWidgetItem 指针。 | void |
currentItem | QTableWidgetItem *currentItem() const | 返回当前被选中的 QTableWidgetItem 元素的指针。若没有选中元素,则返回 nullptr 。 | 无 | QTableWidgetItem * :当前选中元素的指针,若无则为 nullptr 。 |
currentRow | int currentRow() const | 返回当前被选中元素所在的行号。若没有选中元素,则返回 -1。 | 无 | int :当前选中元素的行号,若无选中元素则为 -1。 |
currentColumn | int currentColumn() const | 返回当前被选中元素所在的列号。若没有选中元素,则返回 -1。 | 无 | int :当前选中元素的列号,若无选中元素则为 -1。 |
row | int row(const QTableWidgetItem *item) const | 获取指定 QTableWidgetItem 元素所在的行号。若该元素不在表格中,则返回 -1。 | const QTableWidgetItem *item :要查询的 QTableWidgetItem 指针。 | int :指定元素所在的行号,若元素不在表格中则为 -1。 |
column | int column(const QTableWidgetItem *item) const | 获取指定 QTableWidgetItem 元素所在的列号。若该元素不在表格中,则返回 -1。 | const QTableWidgetItem *item :要查询的 QTableWidgetItem 指针。 | int :指定元素所在的列号,若元素不在表格中则为 -1。 |
rowCount | int rowCount() const | 获取表格的行数。 | 无 | int :表格的行数。 |
columnCount | int columnCount() const | 获取表格的列数。 | 无 | int :表格的列数。 |
insertRow | void insertRow(int row) | 在指定的行位置插入一个新行。原来位于该行及以下的行都会向下移动一行。 | int row :要插入新行的行索引,从 0 开始计数。 | void |
insertColumn | void insertColumn(int column) | 在指定的列位置插入一个新列。原来位于该列及以后的列都会向右移动一列。 | int column :要插入新列的列索引,从 0 开始计数。 | void |
removeRow | void removeRow(int row) | 删除指定行的所有元素,并将该行从表格中移除。原来位于该行以下的行都会向上移动一行。 | int row :要删除的行索引,从 0 开始计数。 | void |
removeColumn | void removeColumn(int column) | 删除指定列的所有元素,并将该列从表格中移除。原来位于该列以后的列都会向左移动一列。 | int column :要删除的列索引,从 0 开始计数。 | void |
setHorizontalHeaderItem | void setHorizontalHeaderItem(int column, QTableWidgetItem *item) | 设置指定列的水平表头元素。 | int column :要设置表头的列索引,从 0 开始计数。 QTableWidgetItem *item :用于作为表头的 QTableWidgetItem 指针。 | void |
setVerticalHeaderItem | void setVerticalHeaderItem(int row, QTableWidgetItem *item) | 设置指定行的垂直表头元素。 | int row :要设置表头的行索引,从 0 开始计数。 QTableWidgetItem *item :用于作为表头的 QTableWidgetItem 指针。 | void |
QTableWidgetItem
属性与上面类似
2.2 常用信号
信号 | 信号原型 | 说明 | 参数 |
---|---|---|---|
cellClicked | void cellClicked(int row, int column) | 当用户点击表格中的某个单元格时,会触发该信号。常用于在用户点击单元格后执行相应的操作,比如显示单元格详细信息、进行数据编辑等。 | int row :被点击单元格所在的行号,行号从 0 开始计数。 int column :被点击单元格所在的列号,列号从 0 开始计数。 |
cellDoubleClicked | void cellDoubleClicked(int row, int column) | 当用户双击表格中的某个单元格时,此信号会被触发。通常用于实现一些需要双击操作激活的功能,例如打开一个新窗口展示单元格关联的数据等。 | int row :被双击单元格所在的行号,行号从 0 开始计数。 int column :被双击单元格所在的列号,列号从 0 开始计数。 |
cellEntered | void cellEntered(int row, int column) | 当鼠标指针进入表格中的某个单元格区域时,会触发该信号。可用于实现鼠标悬停效果,如改变单元格的背景颜色、显示提示信息等。 | int row :鼠标进入单元格所在的行号,行号从 0 开始计数。 int column :鼠标进入单元格所在的列号,列号从 0 开始计数。 |
currentCellChanged | void currentCellChanged(int row, int column, int previousRow, int previousColumn) | 当选中的单元格发生变化时,该信号会被触发。参数中包含了当前选中单元格的行号和列号,以及之前选中单元格的行号和列号。可用于跟踪用户选择单元格的操作,更新相关的界面显示或执行特定的逻辑处理。 | int row :当前选中单元格所在的行号,行号从 0 开始计数。 int column :当前选中单元格所在的列号,列号从 0 开始计数。 int previousRow :之前选中单元格所在的行号,行号从 0 开始计数。 int previousColumn :之前选中单元格所在的列号,列号从 0 开始计数。 |
2.3 例子1,创建表格
在Qt Designer
中设置基本框架
widget.cpp
如下
#include "widget.h"
#include <QDebug>
#include "ui_widget.h"Widget::Widget(QWidget* parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);const static int N = 3;for (int i = 0; i < N; ++i) {// 建行和建列ui->tableWidget->insertRow(i);ui->tableWidget->insertColumn(i);}// 设置列名ui->tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem("学号"));ui->tableWidget->setHorizontalHeaderItem(1, new QTableWidgetItem("姓名"));ui->tableWidget->setHorizontalHeaderItem(2, new QTableWidgetItem("电话"));// 设置初始值, 第0行ui->tableWidget->setItem(0, 0, new QTableWidgetItem("20241001"));ui->tableWidget->setItem(0, 1, new QTableWidgetItem("小A"));ui->tableWidget->setItem(0, 2, new QTableWidgetItem("1561111000"));// 第1行ui->tableWidget->setItem(1, 0, new QTableWidgetItem("20241002")); // 第1行,第0列ui->tableWidget->setItem(1, 1, new QTableWidgetItem("小B")); // 第1行,第1列ui->tableWidget->setItem(1, 2, new QTableWidgetItem("1561111001")); // 第1行,第2列// 第2行ui->tableWidget->setItem(2, 0, new QTableWidgetItem("20241003")); // 第2行,第0列ui->tableWidget->setItem(2, 1, new QTableWidgetItem("小C")); // 第2行,第1列ui->tableWidget->setItem(2, 2, new QTableWidgetItem("1561111002")); // 第2行,第2列
}Widget::~Widget()
{delete ui;
}void Widget::on_add_row_btn_clicked()
{int rowCount = ui->tableWidget->rowCount();ui->tableWidget->insertRow(rowCount);
}void Widget::on_del_row_btn_clicked()
{int curRow = ui->tableWidget->currentRow();if (curRow == -1) {qDebug() << "Row not even exist...";return;}ui->tableWidget->removeRow(curRow);
}void Widget::on_add_col_btn_clicked()
{QString text = ui->lineEdit->text();if (text.isEmpty()) {qDebug() << "LineEdit text empty...";return;}int colCount = ui->tableWidget->columnCount();ui->tableWidget->insertColumn(colCount);ui->tableWidget->setHorizontalHeaderItem(colCount, new QTableWidgetItem(text));
}void Widget::on_del_col_btn_clicked()
{int curCol = ui->tableWidget->currentColumn();if (curCol == -1) {qDebug() << "Column not even exist...";return;}ui->tableWidget->removeColumn(curCol);
}
运行结果如下
#3. QTreeWidget
QTreeWidget
表示一个树形控件,每个元素都是一个QTreeWidgetItem
,每个QTreeWidgetItem
可以包含多个文本和图片。
注意:QTreeWidget
虽然是树形结构,但是这个树形结构并没有体现出根节点,而是从根节点的下一层开始计算的。该层节点就叫做顶层节点(TopLevelItem)。
3.1 常用属性和方法
方法 | 方法原型 | 说明 | 参数 | 返回值 |
---|---|---|---|---|
clear | void clear() | 清空 QTreeWidget 中的所有子节点,包括顶层节点及其子节点,将树状结构恢复为空状态。 | 无 | void |
addTopLevelItem | void addTopLevelItem(QTreeWidgetItem *item) | 向 QTreeWidget 中新增一个顶层节点。顶层节点是树状结构中最上层的节点。 | QTreeWidgetItem *item :要添加的顶层节点指针 | void |
topLevelItem | QTreeWidgetItem *topLevelItem(int index) const | 根据指定的下标获取对应的顶层节点。 | int index :顶层节点的下标,从 0 开始计数 | QTreeWidgetItem * :指定下标的顶层节点指针,如果下标超出范围则返回 nullptr |
topLevelItemCount | int topLevelItemCount() const | 获取 QTreeWidget 中顶层节点的个数。 | 无 | int :顶层节点的数量 |
indexOfTopLevelItem | int indexOfTopLevelItem(QTreeWidgetItem *item) const | 查询指定的节点在顶层节点中的下标。 | QTreeWidgetItem *item :要查询的节点指针 | int :指定节点在顶层节点中的下标,如果该节点不是顶层节点则返回 -1 |
takeTopLevelItem | QTreeWidgetItem *takeTopLevelItem(int index) | 删除指定下标的顶层节点,并返回被删除的节点指针。调用该方法后,被删除的节点不再属于 QTreeWidget ,需要手动管理其内存。 | int index :要删除的顶层节点的下标,从 0 开始计数 | QTreeWidgetItem * :被删除的顶层节点指针,如果下标超出范围则返回 nullptr |
currentItem | QTreeWidgetItem *currentItem() const | 获取当前被选中的节点。 | 无 | QTreeWidgetItem * :当前选中的节点指针,如果没有选中节点则返回 nullptr |
setCurrentItem | void setCurrentItem(QTreeWidgetItem *item) | 将指定的节点设置为当前选中节点。 | QTreeWidgetItem *item :要设置为选中状态的节点指针 | void |
setExpanded | void setExpanded(bool expanded) | 展开或关闭 QTreeWidget 中的所有节点。当参数为 true 时,所有节点展开;当参数为 false 时,所有节点关闭。 | bool expanded :true 表示展开节点,false 表示关闭节点 | void |
setHeaderLabel | void setHeaderLabel(const QString &text) | 设置 QTreeWidget 的表头标签文本。表头位于树状结构的顶部,用于标识各列的含义。 | const QString &text :要设置的表头标签文本 | void |
下面是QTreeWidgetItem
的部分方法
方法 | 方法原型 | 说明 | 参数 | 返回值 |
---|---|---|---|---|
addChild | void addChild(QTreeWidgetItem *child) | 为当前 QTreeWidgetItem 新增一个子节点。新增的子节点会显示在当前节点的下一级。 | QTreeWidgetItem *child :要添加的子节点指针 | void |
childCount | int childCount() const | 获取当前 QTreeWidgetItem 的子节点个数。可用于判断当前节点下是否有子节点以及子节点的数量。 | 无 | int :子节点的数量 |
child | QTreeWidgetItem *child(int index) const | 根据指定的下标获取当前 QTreeWidgetItem 的子节点。 | int index :子节点的下标,从 0 开始计数 | QTreeWidgetItem * :指定下标的子节点指针,如果下标超出范围则返回 nullptr |
takeChild | QTreeWidgetItem *takeChild(int index) | 删除当前 QTreeWidgetItem 对应下标的子节点,并返回被删除的子节点指针。调用该方法后,被删除的子节点不再属于当前节点,需要手动管理其内存。 | int index :要删除的子节点的下标,从 0 开始计数 | QTreeWidgetItem * :被删除的子节点指针,如果下标超出范围则返回 nullptr |
removeChild | void removeChild(QTreeWidgetItem *child) | 从当前 QTreeWidgetItem 中删除指定的子节点。与 takeChild 不同,该方法不返回被删除的子节点指针。 | QTreeWidgetItem *child :要删除的子节点指针 | void |
parent | QTreeWidgetItem *parent() const | 获取当前 QTreeWidgetItem 的父节点。如果当前节点是顶层节点,则返回 nullptr 。 | 无 | QTreeWidgetItem * :父节点的指针,如果没有父节点则返回 nullptr |
3.2 常用信号
信号 | 信号原型 | 说明 | 参数 |
---|---|---|---|
currentItemChanged | void currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *old) | 当 QTreeWidget 中选中的元素发生切换时,该信号会被触发。可用于在用户改变选中节点时执行相应的操作,比如更新界面上显示的节点详细信息等。 | 1. QTreeWidgetItem *current :当前新选中的节点指针。 2. QTreeWidgetItem *old :之前被选中的节点指针。 |
itemClicked | void itemClicked(QTreeWidgetItem *item, int col) | 当用户点击 QTreeWidget 中的某个元素时,此信号会被触发。常用于实现点击节点后的特定功能,例如展开子节点、显示关联数据等。 | 1. QTreeWidgetItem *item :被点击的节点指针。 2. int col :被点击节点所在的列索引,列索引从 0 开始计数。 |
itemDoubleClicked | void itemDoubleClicked(QTreeWidgetItem *item, int col) | 当用户双击 QTreeWidget 中的某个元素时,该信号会被触发。通常用于执行一些需要双击操作激活的功能,比如打开一个新窗口展示节点的详细内容等。 | 1. QTreeWidgetItem *item :被双击的节点指针。 2. int col :被双击节点所在的列索引,列索引从 0 开始计数。 |
itemEntered | void itemEntered(QTreeWidgetItem *item, int col) | 当鼠标指针进入 QTreeWidget 中的某个元素区域时,该信号会被触发。可用于实现鼠标悬停效果,如改变节点的显示样式、显示提示信息等。 | 1. QTreeWidgetItem *item :鼠标进入的节点指针。 2. int col :鼠标进入节点所在的列索引,列索引从 0 开始计数。 |
itemExpanded | void itemExpanded(QTreeWidgetItem *item) | 当 QTreeWidget 中的某个元素被展开时,该信号会被触发。可用于在节点展开时执行一些额外的操作,比如加载子节点的数据等。 | QTreeWidgetItem *item :被展开的节点指针。 |
itemCollapsed | void itemCollapsed(QTreeWidgetItem *item) | 当 QTreeWidget 中的某个元素被折叠时,该信号会被触发。可用于在节点折叠时执行一些清理操作,比如释放子节点占用的资源等。 | QTreeWidgetItem *item :被折叠的节点指针。 |
3.3 例子1,创建树形结构
在Qt Designer
中设置基本框架
widget.cpp
如下
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget* parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 设置列数ui->treeWidget->setColumnCount(2);// 设置表头标签文本ui->treeWidget->setHeaderLabels(QStringList() << "名称" << "english");// 添加顶层节点addTopLevelItemWithText(0, "姓名");addTopLevelItemWithText(0, "电话");addTopLevelItemWithText(1, "name");addTopLevelItemWithText(1, "phone");
}Widget::~Widget()
{delete ui;
}// 辅助函数, 添加顶层节点并设置文本
void Widget::addTopLevelItemWithText(int column, const QString &text)
{QTreeWidgetItem* item = new QTreeWidgetItem();item->setText(column, text);ui->treeWidget->addTopLevelItem(item);
}void Widget::on_addToTop_clicked()
{QString text = ui->lineEdit->text();if(text.isEmpty()) {return;}addTopLevelItemWithText(0, text);addTopLevelItemWithText(1, text + "abc"); // 这里可以加个哈希表
}void Widget::on_addToSelect_clicked()
{QString text = ui->lineEdit->text();if(text.isEmpty()) {return;}QTreeWidgetItem* cur = ui->treeWidget->currentItem();if(cur == nullptr) {return;}QTreeWidgetItem* item = new QTreeWidgetItem();item->setText(cur->columnCount()-1, text);cur->addChild(item);
}void Widget::on_removeSelect_clicked()
{auto cur = ui->treeWidget->currentItem();if(cur == nullptr) {return;}auto parent = cur->parent();if(parent != nullptr) {// 不是顶层节点parent->removeChild(cur);delete cur;} else {// 是顶层节点int index = ui->treeWidget->indexOfTopLevelItem(cur); // 获取下标ui->treeWidget->takeTopLevelItem(index);}
}
运行结果如下