Qt常用控件 多元素控件

文章目录

  • 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

xxWidgetxxView之间的区别:

  • 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读写truefalse
isWrapping用于设置列表项是否允许换行显示。若设置为 true,当列表项的内容过长时,会自动换行显示;设置为 false 时,内容会以单行显示,超出部分可能会被截断。bool读写truefalse
itemAlignment定义列表项中文本或元素的对齐方式,例如左对齐、右对齐、居中对齐等。可以根据需要调整列表项内容的显示位置。Qt::Alignment读写常见取值如 Qt::AlignLeftQt::AlignRightQt::AlignCenter
selectRectVisible控制被选中的元素的矩形边框是否可见。设置为 true 时,选中的列表项会显示一个矩形边框以突出显示;设置为 false 时,不显示该边框。bool读写truefalse
spacing指定列表中各个元素(列表项)之间的间隔大小。通过调整该属性,可以改变列表项之间的间距,从而影响列表的布局和外观。int读写大于等于0的整数

方法

方法方法原型说明参数返回值
addItemvoid addItem(const QString &label) void addItem(QListWidgetItem *item)向列表中添加元素。第一个重载方法接受一个字符串作为元素的文本标签;第二个重载方法接受一个 QListWidgetItem 对象指针,可以自定义元素的属性(如图标、字体等)。1. const QString &label:要添加元素的文本标签。 2. QListWidgetItem *item:要添加的 QListWidgetItem 对象指针。void
currentItemQListWidgetItem *currentItem() const返回当前选中的元素。返回的是一个 QListWidgetItem 对象指针,可以通过该指针访问和修改选中元素的属性。QListWidgetItem *:当前选中的元素指针,若没有选中元素则返回 nullptr
setCurrentItemvoid setCurrentItem(QListWidgetItem *item)设置选中哪个元素。将指定的 QListWidgetItem 对象设置为当前选中元素。QListWidgetItem *item:要设置为选中状态的元素指针。void
setCurrentRowvoid setCurrentRow(int row)设置选中第几行的元素。通过行索引来指定要选中的元素。int row:要选中元素的行索引,索引从 0 开始。void
insertItemvoid 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
itemQListWidgetItem *item(int row) const返回指定行的元素。通过行索引获取对应行的 QListWidgetItem 对象指针。int row:要获取元素的行索引,索引从 0 开始。QListWidgetItem *:指定行的元素指针,若行索引超出范围则返回 nullptr
takeItemQListWidgetItem *takeItem(int row)删除指定行的元素,并返回被删除的元素指针。删除后,该元素不再属于 QListWidget,但指针仍然有效,需要手动管理其内存。int row:要删除元素的行索引,索引从 0 开始。QListWidgetItem *:被删除的元素指针,若行索引超出范围则返回 nullptr

1.2 常用信号

信号信号原型说明参数
currentItemChangedvoid currentItemChanged(QListWidgetItem *current, QListWidgetItem *old)当选中的元素发生改变时触发该信号。可用于在用户切换选中元素时执行相应的操作,比如更新其他界面元素显示选中元素的详细信息等。1. QListWidgetItem *current:当前新选中的元素指针。 2. QListWidgetItem *old:之前被选中的元素指针。
currentRowChangedvoid currentRowChanged(int currentRow)同样在选中的元素改变时触发,不过此信号传递的是当前选中元素所在的行号。适用于根据行号进行一些逻辑处理的场景。int currentRow:当前选中元素的行号,行号从 0 开始计数。
itemClickedvoid itemClicked(QListWidgetItem *item)当用户点击列表中的某个元素时触发该信号。常用于实现点击元素后的特定操作,如打开一个新窗口显示元素详情等。QListWidgetItem *item:被点击的元素指针。
itemDoubleClickedvoid itemDoubleClicked(QListWidgetItem *item)当用户双击列表中的某个元素时触发该信号。常见应用场景是通过双击元素执行一些更深入的操作,例如打开文件等。QListWidgetItem *item:被双击的元素指针。
itemEnteredvoid itemEntered(QListWidgetItem *item)当鼠标指针进入列表中的某个元素区域时触发该信号。可用于实现鼠标悬停效果,如改变元素的显示样式等。QListWidgetItem *item:鼠标进入的元素指针。

##1.3 QListWidgetItem

这个类表示QListWidget的一个元素。下面是常用方法

方法方法原型说明参数返回值
setFontvoid setFont(const QFont &font)用于设置列表项的字体样式,包括字体的类型、大小、加粗、倾斜等属性。const QFont &font:一个 QFont 对象,包含了要设置的字体信息。void
setIconvoid setIcon(const QIcon &icon)为列表项设置图标,图标会显示在列表项文本的旁边,增强列表项的可视化效果。const QIcon &icon:一个 QIcon 对象,代表要设置的图标。void
setHiddenvoid setHidden(bool hide)控制列表项是否隐藏。当设置为 true 时,列表项将不可见;设置为 false 时,列表项正常显示。bool hidetrue 表示隐藏列表项,false 表示显示列表项。void
setSizeHintvoid setSizeHint(const QSize &size)设置列表项的推荐尺寸,列表项会尽量按照指定的尺寸进行显示。这在需要自定义列表项大小的场景中很有用。const QSize &size:一个 QSize 对象,包含了列表项的宽度和高度信息。void
setSelectedvoid setSelected(bool select)设置列表项是否处于选中状态。当设置为 true 时,列表项会被选中;设置为 false 时,列表项会取消选中状态。bool selecttrue 表示选中列表项,false 表示取消选中。void
setTextvoid setText(const QString &text)用于设置列表项显示的文本内容。const QString &text:要设置的文本字符串。void
setTextAlignmentvoid setTextAlignment(int alignment)设置列表项中文本的对齐方式,例如左对齐、右对齐、居中对齐等。int alignment:对齐方式的标志,可以使用 Qt::Alignment 枚举值,如 Qt::AlignLeftQt::AlignRightQt::AlignCenter 等。void

1.4 例子1,操作元素

Qt Designer中设置基本框架

image-20250201163932343

给两个按钮添加槽函数

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);
    }
}

运行结果如下

image-20250201164004846

2. QTableWidget

QTableWidget表示表格控件

2.1 常用属性和方法

属性具体见1.1。有两个独有的属性columnCountrowCount,分别表示表格列数和行数

下面是常用方法

方法方法原型说明参数返回值
itemQTableWidgetItem *item(int row, int column) const根据指定的行和列获取表格中对应位置的 QTableWidgetItem 指针。若该位置没有元素,则返回 nullptrint row:行索引,从 0 开始计数。 int column:列索引,从 0 开始计数。QTableWidgetItem *:指定位置的 QTableWidgetItem 指针,若无则为 nullptr
setItemvoid setItem(int row, int column, QTableWidgetItem *item)在指定的行和列位置设置一个 QTableWidgetItem 元素。若该位置已有元素,会被新元素替换。int row:行索引,从 0 开始计数。 int column:列索引,从 0 开始计数。 QTableWidgetItem *item:要设置的 QTableWidgetItem 指针。void
currentItemQTableWidgetItem *currentItem() const返回当前被选中的 QTableWidgetItem 元素的指针。若没有选中元素,则返回 nullptrQTableWidgetItem *:当前选中元素的指针,若无则为 nullptr
currentRowint currentRow() const返回当前被选中元素所在的行号。若没有选中元素,则返回 -1。int:当前选中元素的行号,若无选中元素则为 -1。
currentColumnint currentColumn() const返回当前被选中元素所在的列号。若没有选中元素,则返回 -1。int:当前选中元素的列号,若无选中元素则为 -1。
rowint row(const QTableWidgetItem *item) const获取指定 QTableWidgetItem 元素所在的行号。若该元素不在表格中,则返回 -1。const QTableWidgetItem *item:要查询的 QTableWidgetItem 指针。int:指定元素所在的行号,若元素不在表格中则为 -1。
columnint column(const QTableWidgetItem *item) const获取指定 QTableWidgetItem 元素所在的列号。若该元素不在表格中,则返回 -1。const QTableWidgetItem *item:要查询的 QTableWidgetItem 指针。int:指定元素所在的列号,若元素不在表格中则为 -1。
rowCountint rowCount() const获取表格的行数。int:表格的行数。
columnCountint columnCount() const获取表格的列数。int:表格的列数。
insertRowvoid insertRow(int row)在指定的行位置插入一个新行。原来位于该行及以下的行都会向下移动一行。int row:要插入新行的行索引,从 0 开始计数。void
insertColumnvoid insertColumn(int column)在指定的列位置插入一个新列。原来位于该列及以后的列都会向右移动一列。int column:要插入新列的列索引,从 0 开始计数。void
removeRowvoid removeRow(int row)删除指定行的所有元素,并将该行从表格中移除。原来位于该行以下的行都会向上移动一行。int row:要删除的行索引,从 0 开始计数。void
removeColumnvoid removeColumn(int column)删除指定列的所有元素,并将该列从表格中移除。原来位于该列以后的列都会向左移动一列。int column:要删除的列索引,从 0 开始计数。void
setHorizontalHeaderItemvoid setHorizontalHeaderItem(int column, QTableWidgetItem *item)设置指定列的水平表头元素。int column:要设置表头的列索引,从 0 开始计数。 QTableWidgetItem *item:用于作为表头的 QTableWidgetItem 指针。void
setVerticalHeaderItemvoid setVerticalHeaderItem(int row, QTableWidgetItem *item)设置指定行的垂直表头元素。int row:要设置表头的行索引,从 0 开始计数。 QTableWidgetItem *item:用于作为表头的 QTableWidgetItem 指针。void

QTableWidgetItem属性与上面类似

2.2 常用信号

信号信号原型说明参数
cellClickedvoid cellClicked(int row, int column)当用户点击表格中的某个单元格时,会触发该信号。常用于在用户点击单元格后执行相应的操作,比如显示单元格详细信息、进行数据编辑等。int row:被点击单元格所在的行号,行号从 0 开始计数。 int column:被点击单元格所在的列号,列号从 0 开始计数。
cellDoubleClickedvoid cellDoubleClicked(int row, int column)当用户双击表格中的某个单元格时,此信号会被触发。通常用于实现一些需要双击操作激活的功能,例如打开一个新窗口展示单元格关联的数据等。int row:被双击单元格所在的行号,行号从 0 开始计数。 int column:被双击单元格所在的列号,列号从 0 开始计数。
cellEnteredvoid cellEntered(int row, int column)当鼠标指针进入表格中的某个单元格区域时,会触发该信号。可用于实现鼠标悬停效果,如改变单元格的背景颜色、显示提示信息等。int row:鼠标进入单元格所在的行号,行号从 0 开始计数。 int column:鼠标进入单元格所在的列号,列号从 0 开始计数。
currentCellChangedvoid 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中设置基本框架

image-20250202130703024

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);
}

运行结果如下

image-20250202130635672

#3. QTreeWidget

QTreeWidget表示一个树形控件,每个元素都是一个QTreeWidgetItem,每个QTreeWidgetItem可以包含多个文本和图片。

注意QTreeWidget虽然是树形结构,但是这个树形结构并没有体现出根节点,而是从根节点的下一层开始计算的。该层节点就叫做顶层节点(TopLevelItem)。

3.1 常用属性和方法

方法方法原型说明参数返回值
clearvoid clear()清空 QTreeWidget 中的所有子节点,包括顶层节点及其子节点,将树状结构恢复为空状态。void
addTopLevelItemvoid addTopLevelItem(QTreeWidgetItem *item)QTreeWidget 中新增一个顶层节点。顶层节点是树状结构中最上层的节点。QTreeWidgetItem *item:要添加的顶层节点指针void
topLevelItemQTreeWidgetItem *topLevelItem(int index) const根据指定的下标获取对应的顶层节点。int index:顶层节点的下标,从 0 开始计数QTreeWidgetItem *:指定下标的顶层节点指针,如果下标超出范围则返回 nullptr
topLevelItemCountint topLevelItemCount() const获取 QTreeWidget 中顶层节点的个数。int:顶层节点的数量
indexOfTopLevelItemint indexOfTopLevelItem(QTreeWidgetItem *item) const查询指定的节点在顶层节点中的下标。QTreeWidgetItem *item:要查询的节点指针int:指定节点在顶层节点中的下标,如果该节点不是顶层节点则返回 -1
takeTopLevelItemQTreeWidgetItem *takeTopLevelItem(int index)删除指定下标的顶层节点,并返回被删除的节点指针。调用该方法后,被删除的节点不再属于 QTreeWidget,需要手动管理其内存。int index:要删除的顶层节点的下标,从 0 开始计数QTreeWidgetItem *:被删除的顶层节点指针,如果下标超出范围则返回 nullptr
currentItemQTreeWidgetItem *currentItem() const获取当前被选中的节点。QTreeWidgetItem *:当前选中的节点指针,如果没有选中节点则返回 nullptr
setCurrentItemvoid setCurrentItem(QTreeWidgetItem *item)将指定的节点设置为当前选中节点。QTreeWidgetItem *item:要设置为选中状态的节点指针void
setExpandedvoid setExpanded(bool expanded)展开或关闭 QTreeWidget 中的所有节点。当参数为 true 时,所有节点展开;当参数为 false 时,所有节点关闭。bool expandedtrue 表示展开节点,false 表示关闭节点void
setHeaderLabelvoid setHeaderLabel(const QString &text)设置 QTreeWidget 的表头标签文本。表头位于树状结构的顶部,用于标识各列的含义。const QString &text:要设置的表头标签文本void

下面是QTreeWidgetItem的部分方法

方法方法原型说明参数返回值
addChildvoid addChild(QTreeWidgetItem *child)为当前 QTreeWidgetItem 新增一个子节点。新增的子节点会显示在当前节点的下一级。QTreeWidgetItem *child:要添加的子节点指针void
childCountint childCount() const获取当前 QTreeWidgetItem 的子节点个数。可用于判断当前节点下是否有子节点以及子节点的数量。int:子节点的数量
childQTreeWidgetItem *child(int index) const根据指定的下标获取当前 QTreeWidgetItem 的子节点。int index:子节点的下标,从 0 开始计数QTreeWidgetItem *:指定下标的子节点指针,如果下标超出范围则返回 nullptr
takeChildQTreeWidgetItem *takeChild(int index)删除当前 QTreeWidgetItem 对应下标的子节点,并返回被删除的子节点指针。调用该方法后,被删除的子节点不再属于当前节点,需要手动管理其内存。int index:要删除的子节点的下标,从 0 开始计数QTreeWidgetItem *:被删除的子节点指针,如果下标超出范围则返回 nullptr
removeChildvoid removeChild(QTreeWidgetItem *child)从当前 QTreeWidgetItem 中删除指定的子节点。与 takeChild 不同,该方法不返回被删除的子节点指针。QTreeWidgetItem *child:要删除的子节点指针void
parentQTreeWidgetItem *parent() const获取当前 QTreeWidgetItem 的父节点。如果当前节点是顶层节点,则返回 nullptrQTreeWidgetItem *:父节点的指针,如果没有父节点则返回 nullptr

3.2 常用信号

信号信号原型说明参数
currentItemChangedvoid currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *old)QTreeWidget 中选中的元素发生切换时,该信号会被触发。可用于在用户改变选中节点时执行相应的操作,比如更新界面上显示的节点详细信息等。1. QTreeWidgetItem *current:当前新选中的节点指针。 2. QTreeWidgetItem *old:之前被选中的节点指针。
itemClickedvoid itemClicked(QTreeWidgetItem *item, int col)当用户点击 QTreeWidget 中的某个元素时,此信号会被触发。常用于实现点击节点后的特定功能,例如展开子节点、显示关联数据等。1. QTreeWidgetItem *item:被点击的节点指针。 2. int col:被点击节点所在的列索引,列索引从 0 开始计数。
itemDoubleClickedvoid itemDoubleClicked(QTreeWidgetItem *item, int col)当用户双击 QTreeWidget 中的某个元素时,该信号会被触发。通常用于执行一些需要双击操作激活的功能,比如打开一个新窗口展示节点的详细内容等。1. QTreeWidgetItem *item:被双击的节点指针。 2. int col:被双击节点所在的列索引,列索引从 0 开始计数。
itemEnteredvoid itemEntered(QTreeWidgetItem *item, int col)当鼠标指针进入 QTreeWidget 中的某个元素区域时,该信号会被触发。可用于实现鼠标悬停效果,如改变节点的显示样式、显示提示信息等。1. QTreeWidgetItem *item:鼠标进入的节点指针。 2. int col:鼠标进入节点所在的列索引,列索引从 0 开始计数。
itemExpandedvoid itemExpanded(QTreeWidgetItem *item)QTreeWidget 中的某个元素被展开时,该信号会被触发。可用于在节点展开时执行一些额外的操作,比如加载子节点的数据等。QTreeWidgetItem *item:被展开的节点指针。
itemCollapsedvoid itemCollapsed(QTreeWidgetItem *item)QTreeWidget 中的某个元素被折叠时,该信号会被触发。可用于在节点折叠时执行一些清理操作,比如释放子节点占用的资源等。QTreeWidgetItem *item:被折叠的节点指针。

3.3 例子1,创建树形结构

Qt Designer中设置基本框架

image-20250203222814528

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);
    }
}

运行结果如下

image-20250203222739302

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/964392.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于RTOS的STM32游戏机

1.游戏机的主要功能 所有游戏都来着B站JL单片机博主开源 这款游戏机具备存档与继续游戏功能&#xff0c;允许玩家在任何时候退出当前游戏并保存进度&#xff0c;以便日后随时并继续之前的冒险。不仅如此&#xff0c;游戏机还支持多任务处理&#xff0c;玩家可以在退出当前游戏…

动态获取脚本名称作为日志文件的名称

优点 独立性&#xff1a; 每个脚本的日志独立存储&#xff0c;避免日志混杂&#xff0c;便于排查问题。 灵活性&#xff1a; 支持动态获取脚本名称&#xff0c;无需手动指定日志记录器名称。 可扩展性&#xff1a; 可以轻松扩展日志格式、级别、存储路径等功能。 易用性&…

站在JavaScript的视角去看,HTML的DOM和GLTF的Json数据。

很多前端小伙伴没有见过、操作过gltf文件&#xff0c;对非常懵逼&#xff0c;本文从前端小伙伴最熟悉的dom模型为切入口&#xff0c;以类别的方式来学习一下gltf文件。 一、结构与组织形式 HTML DOM&#xff08;文档对象模型&#xff09;&#xff1a; 树形结构&#xff1a;HT…

字节序与Socket编程

字节序 字节序分为大端字节序(Big-Endian) 和小端字节序(Little-Endian)。大端字节序是指一个整 数的最高位字节(23 ~ 31 bit)存储在内存的低地址处,低位字节(0 ~ 7 bit)存储在内存的高地址处;小端字节序则是指整数的高位字节存储在内存的高地址处,而低位字节则存储…

Verilog基础(三):过程

过程(Procedures) - Always块 – 组合逻辑 (Always blocks – Combinational) 由于数字电路是由电线相连的逻辑门组成的&#xff0c;所以任何电路都可以表示为模块和赋值语句的某种组合. 然而&#xff0c;有时这不是描述电路最方便的方法. 两种always block是十分有用的&am…

[mmdetection]fast-rcnn模型训练自己的数据集的详细教程

本篇博客是由本人亲自调试成功后的学习笔记。使用了mmdetection项目包进行fast-rcnn模型的训练&#xff0c;数据集是自制图像数据。废话不多说&#xff0c;下面进入训练步骤教程。 注&#xff1a;本人使用linux服务器进行展示&#xff0c;Windows环境大差不差。另外&#xff0…

计算机网络——三种交换技术

目录 电路交换——用于电话网络 电路交换的优点&#xff1a; 电路交换的缺点&#xff1a; 报文交换——用于电报网络 报文交换的优点&#xff1a; 报文交换的缺点&#xff1a; 分组交换——用于现代计算机网络 分组交换的优点&#xff1a; 分组交换的缺点 电路交换——…

Java项目: 基于SpringBoot+mybatis+maven+mysql实现的图书管理系统(含源码+数据库+答辩PPT+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismavenmysql实现的图书管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观…

Spring PropertyPlaceholderConfigurer多配置问题

本文重点是通过例子代码的debug了解PropertyPlaceholderConfigurer的原理 更多可阅读&#xff1a;placeholderconfigurer文档 了解 目录 测试程序如下PropertyPlaceholderConfigurerplaceholderConfigurer1 & placeholderConfigurer2的执行userbean的BeanDefinition应用Pr…

利用Vue编写一个“计数器”

目录 一、利用Vue编写一个“计数器”的操作方法&#xff1a;二、html文件相关源代码三、CSS文件相关源代码四、代码执行效果展示如下 一、利用Vue编写一个“计数器”的操作方法&#xff1a; 1、data中定义计数器的相关数据&#xff0c;如num、min、max。 2、methods中添加计数…

aws(学习笔记第二十七课) 使用aws API Gateway+lambda体验REST API

aws(学习笔记第二十七课) 使用aws API Gatewaylambda体验REST API 学习内容&#xff1a; 使用aws API Gatewaylambda 1. 使用aws API Gatewaylambda 作成概要 使用api gateway定义REST API&#xff0c;之后再接收到了http request之后&#xff0c;redirect到lambda进行执行。…

自研有限元软件与ANSYS精度对比-Bar3D2Node三维杆单元模型-央视大裤衩实例

目录 1、“央视大裤衩”自研有限元软件求解 1.1、选择单元类型 1.2、导入“央视大裤衩”工程 1.3、节点坐标定义 1.4、单元连接关系、材料定义 1.5、约束定义 1.6、外载定义 1.7、矩阵求解 1.8、变形云图展示 1.9、节点位移 1.10、单元应力 1.11、节点支反力 2、“…

家政预约小程序12服务详情

目录 1 修改数据源2 创建页面3 搭建轮播图4 搭建基本信息5 显示服务规格6 搭建服务描述7 设置过滤条件总结 我们已经在首页、分类页面显示了服务的列表信息&#xff0c;当点击服务的内容时候需要显示服务的详情信息&#xff0c;本篇介绍一下详情页功能的搭建。 1 修改数据源 在…

Multi-Scale Heterogeneous Text-Attributed Graph Datasets From Diverse Domains

Multi-Scale Heterogeneous Text-Attributed Graph Datasets From Diverse Domains WWW25 推荐指数&#xff1a;#paper/⭐⭐⭐#​ 代码地址&#xff1a;https://github.com/Cloudy1225/HTAG 作者主页&#xff1a;Yunhui Lius Homepage 一句话总结&#xff1a;提出了涵盖多…

day31-综合架构开篇(中)

轻松理解网站架构 运维内网维护架构

使用 SpringBoot+Thymeleaf 模板引擎进行 Web 开发

目录 一、什么是 Thymeleaf 模板引擎 二、Thymeleaf 模板引擎的 Maven 坐标 三、配置 Thymeleaf 四、访问页面 五、访问静态资源 六、Thymeleaf 使用示例 七、Thymeleaf 常用属性 前言 在现代 Web 开发中&#xff0c;模板引擎被广泛用于将动态内容渲染到静态页面中。Thy…

Verilog基础(一):基础元素

verilog基础 我先说&#xff0c;看了肯定会忘&#xff0c;但是重要的是这个过程&#xff0c;我们知道了概念&#xff0c;知道了以后在哪里查询。语法都是术&#xff0c;通用的概念是术。所以如果你有相关的软件编程经验&#xff0c;那么其实开启这个学习之旅&#xff0c;你会感…

保姆级教程Docker部署Kafka官方镜像

目录 一、安装Docker及可视化工具 二、单节点部署 1、创建挂载目录 2、运行Kafka容器 3、Compose运行Kafka容器 4、查看Kafka运行状态 三、集群部署 在Kafka2.8版本之前&#xff0c;Kafka是强依赖于Zookeeper中间件的&#xff0c;这本身就很不合理&#xff0c;中间件依赖…

yes镜像站群/PHP驱动的镜像站群架构实践

▍当前站群运维的三大技术困局 在近期与多个IDC服务商的交流中发现&#xff0c;传统站群系统普遍面临&#xff1a; 同步效率瓶颈&#xff1a;跨服务器内容同步耗时超过行业标准的42%SEO权重稀释&#xff1a;镜像站点重复率导致70%的站点无法进入百度前3页运维成本失控&#x…

知识库管理系统提升知识利用效率与企业创新能力的全面方案分析

内容概要 知识库管理系统作为现代企业信息化建设的重要组成部分&#xff0c;承担着整合、存储与分发知识资源的重任。其核心功能包括信息的分类与索引、知识的共享与协作&#xff0c;以及数据分析与挖掘等。这些功能不仅提高了企业内部信息流动的速度和效果&#xff0c;还为员…