Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍ListWidget列表框组件的常用方法及灵活运用。

QListWidget 是 Qt 中的一个列表框组件,用于显示一列项目,并允许用户进行选择。每个项目可以包含一个图标和文本,可以使用 QListWidgetItem 类来表示。ListWidget组件与TreeWidget有些相似,区别在于TreeWidget可以实现嵌套以及多字段结构,而ListWidget则只能实现单字段结构,该组件常用于显示单条记录,例如只显示IP地址,用户名等数据。

以下是 QListWidget 类的一些常用方法,说明和概述:

方法 描述
addItem(QListWidgetItem *item) 向列表中添加一个项目。
addItems(const QStringList &labels) 向列表中添加多个项目。
count() 返回列表中的项目数量。
currentItem() 返回当前选择的项目。
item(int row) 返回给定行索引的项目。
itemAt(const QPoint &p) 返回给定坐标处的项目。
takeItem(int row) 从列表中删除并返回给定行索引的项目。
clear() 删除列表中的所有项目。
clearSelection() 取消选择所有项目。
removeItemWidget(QListWidgetItem *item) 从列表中删除一个项目并释放与之关联的任何小部件。
scrollToItem(QListWidgetItem *item, QAbstractItemView::ScrollHint hint = EnsureVisible) 滚动列表以确保给定项目可见。
sortItems(Qt::SortOrder order = Qt::AscendingOrder) 对列表中的项目进行排序。
itemClicked(QListWidgetItem *item) 项目被点击时发出的信号。
itemDoubleClicked(QListWidgetItem *item) 项目被双击时发出的信号。
setItemWidget(QListWidgetItem *item, QWidget *widget) 在给定项目的位置设置小部件。
setIconSize(const QSize &size) 设置项目图标的大小。
setCurrentRow(int row) 设置当前选择的行。
setCurrentItem(QListWidgetItem *item) 设置当前选择的项目。
selectedItems() 返回当前选择的所有项目。
selectedIndexes() 返回当前选择的所有项目的模型索引。
setSelectionMode(QAbstractItemView::SelectionMode mode) 设置选择模式,例如 SingleSelectionMultiSelection

这只是 QListWidget 类的一部分方法。你可以查阅官方文档以获取完整的方法列表,以及这些方法的详细说明。

首先读者可自行绘制好如下所示的UI界面,在界面中左侧包含一个ListWidget列表框,右侧包含各类用于控制组件的pushButton按钮,如下图所示;

1.1 初始化节点

如下代码是一个槽函数 on_pushButton_init_clicked,主要作用是初始化一个 QListWidget 列表框,其中包含了一系列的 QListWidgetItem 项。

以下是概述:

  1. 清空列表框: 首先,通过 ui->listWidget->clear() 清空了列表框,以确保在初始化之前移除已有的项。
  2. 循环初始化项: 使用 for 循环,遍历了 0 到 9 的数字,共初始化了 10 个项。
  3. 创建 QListWidgetItem 对于每个循环,通过 new QListWidgetItem() 创建了一个新的 QListWidgetItem 对象 aItem
  4. 设置文本标签: 使用 setText 方法为 QListWidgetItem 设置了文本标签,内容是形如 "192.168.1.x" 的字符串。
  5. 设置图标: 使用 setIcon 方法为每个项设置了相同的图标,这里使用了名为 "1.ico" 的图标。
  6. 设置为选中状态: 使用 setCheckState 方法将每个项设为选中状态,即显示复选框并勾选。
  7. 设置不可编辑状态: 使用 setFlags 方法将每个项设置为不可编辑状态,只允许选择和检查操作。
  8. 增加项到列表中: 使用 ui->listWidget->addItem(aItem) 将每个项添加到 QListWidget 中。

该槽函数用于初始化一个包含特定图标、文本、复选框等属性的 QListWidget,方便用户进行选择和操作。

  1. // 初始化列表
  2. void MainWindow::on_pushButton_init_clicked()
  3. {
  4. // 每一行是一个QListWidgetItem
  5. QListWidgetItem *aItem;
  6. // 设置ICON的图标
  7. QIcon aIcon;
  8. aIcon.addFile(":/image/1.ico");
  9. // 清空列表框
  10. ui->listWidget->clear();
  11. // 循环初始化
  12. for(int x=0;x<10;x++)
  13. {
  14. // 填充字符串
  15. QString str = QString::asprintf("192.168.1.%d",x);
  16. // 新建一个项
  17. aItem = new QListWidgetItem();
  18. aItem->setText(str); // 设置文字标签
  19. aItem->setIcon(aIcon); // 设置图标
  20. aItem->setCheckState(Qt::Checked); // 设为选中状态
  21. aItem->setFlags(Qt::ItemIsSelectable | // 设置为不可编辑状态
  22. Qt::ItemIsUserCheckable
  23. |Qt::ItemIsEnabled);
  24. // 增加项到列表中
  25. ui->listWidget->addItem(aItem);
  26. }
  27. }

运行效果如下图;

1.2 设置编辑状态

如下槽函数 on_pushButton_edit_clicked 的主要功能是将所有项设置为可编辑状态。

以下是概述:

  1. 获取所有项数量: 使用 ui->listWidget->count() 获取列表框中的项的数量。
  2. 循环设置状态: 使用 for 循环遍历每个项,获取当前项的句柄。
  3. 设置为可编辑状态: 使用 setFlags 方法将每个项的状态设置为可编辑,包括可选择、可编辑、可检查、可启用等状态。

该槽函数的作用是将列表框中的所有项的状态设置为可编辑,这样用户可以在运行时修改这些项的文本内容。

  1. // 设置所有项设置为可编辑状态
  2. void MainWindow::on_pushButton_edit_clicked()
  3. {
  4. int x,cnt;
  5. QListWidgetItem *aItem;
  6. // 获取所有项数量
  7. cnt = ui->listWidget->count();
  8. for(x=0;x<cnt;x++)
  9. {
  10. // 得到当前选中项句柄
  11. aItem = ui->listWidget->item(x);
  12. // 设置状态
  13. aItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable
  14. |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled);
  15. }
  16. }

运行效果如下图;

1.3 全选与反选

如下槽函数 on_pushButton_selectall_clicked 的核心功能是实现一个全选按钮,即将列表框中的所有项设置为选中状态。

以下是概述:

  1. 获取总数: 使用 ui->listWidget->count() 获取列表框中的项的总数。
  2. 循环设置选中状态: 使用 for 循环遍历每个项,获取每个项的指针。
  3. 设置为选中状态: 使用 setCheckState 方法将每个项的状态设置为选中状态,即勾选复选框。

该槽函数的作用是实现一个全选按钮,方便用户一次性选中所有列表框中的项。

  1. void MainWindow::on_pushButton_selectall_clicked()
  2. {
  3. // 获取总数
  4. int cnt = ui->listWidget->count();
  5. for(int x=0;x<cnt;x++)
  6. {
  7. // 获取到项的指针
  8. QListWidgetItem *aItem = ui->listWidget->item(x);
  9. // 设置为选中
  10. aItem->setCheckState(Qt::Checked);
  11. }
  12. }

如下槽函数 on_pushButton_noselect_clicked 的核心功能是实现一个全不选按钮,即将列表框中的所有项设置为非选中状态。

以下是概述:

  1. 获取总数: 使用 ui->listWidget->count() 获取列表框中的项的总数。
  2. 循环设置非选中状态: 使用 for 循环遍历每个项,获取每个项的指针。
  3. 设置为非选中状态: 使用 setCheckState 方法将每个项的状态设置为非选中状态,即取消勾选复选框。

该槽函数的作用是实现一个全不选按钮,方便用户一次性取消选中列表框中的所有项。

  1. void MainWindow::on_pushButton_noselect_clicked()
  2. {
  3. // 获取总数
  4. int cnt = ui->listWidget->count();
  5. for(int x=0;x<cnt;x++)
  6. {
  7. // 获取到一项指针
  8. QListWidgetItem *aItem = ui->listWidget->item(x);
  9. // 设置为非选中
  10. aItem->setCheckState(Qt::Unchecked);
  11. }
  12. }

如下槽函数 on_pushButton_deselect_clicked 的核心功能是实现一个反选按钮,即将列表框中的每个项的选中状态进行反转。

以下是概述:

  1. 获取总数: 使用 ui->listWidget->count() 获取列表框中的项的总数。
  2. 循环设置反选状态: 使用 for 循环遍历每个项,获取每个项的指针。
  3. 反选状态: 使用 checkState 方法获取每个项的当前选中状态,如果是选中状态 (Qt::Checked),则设置为非选中状态 (Qt::Unchecked),反之亦然。

该槽函数的作用是实现一个反选按钮,方便用户一次性反转列表框中的所有项的选中状态。

  1. void MainWindow::on_pushButton_deselect_clicked()
  2. {
  3. int x,cnt;
  4. QListWidgetItem *aItem;
  5. // 获取总数
  6. cnt = ui->listWidget->count();
  7. for(x=0;x<cnt;x++)
  8. {
  9. // 获取到一项指针
  10. aItem = ui->listWidget->item(x);
  11. // 如果未选中则选中否则不选
  12. if(aItem->checkState() != Qt::Checked)
  13. aItem->setCheckState(Qt::Checked);
  14. else
  15. aItem->setCheckState(Qt::Unchecked);
  16. }
  17. }

运行效果如下图;

1.4 插入与追加

如下槽函数 on_pushButton_add_clicked 的核心功能是实现一个“增加一项”按钮,即在列表框的尾部追加一个新的项。

以下是概述:

  1. 创建图标: 使用 QIcon 创建一个新的图标,这里使用了名为 "2.ico" 的图标。
  2. 创建新的 QListWidgetItem 使用 new QListWidgetItem("新增的项目") 创建一个新的 QListWidgetItem 对象,设置了文本为 "新增的项目"。
  3. 设置图标和状态: 使用 setIcon 设置项的图标,setCheckState 设置项的选中状态为选中,setFlags 设置项的状态为可选择、可检查、可启用。
  4. 追加到控件: 使用 ui->listWidget->addItem(aItem) 将新创建的项追加到列表框的尾部。

该槽函数的作用是在列表框的尾部追加一个新的项,该项包含指定的文本、图标以及初始的选中状态。

  1. void MainWindow::on_pushButton_add_clicked()
  2. {
  3. QIcon aIcon;
  4. aIcon.addFile(":/image/2.ico");
  5. QListWidgetItem *aItem = new QListWidgetItem("新增的项目"); // 增加项目名
  6. aItem->setIcon(aIcon); // 设置图标
  7. aItem->setCheckState(Qt::Checked); // 设置为选中
  8. aItem->setFlags(Qt::ItemIsSelectable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled);
  9. ui->listWidget->addItem(aItem); // 增加到控件
  10. }

如下槽函数 on_pushButton_ins_clicked 的核心功能是实现一个“指定位置插入一项”按钮,即在列表框的指定位置插入一个新的项。

以下是概述:

  1. 创建图标: 使用 QIcon 创建一个新的图标,这里使用了名为 "3.ico" 的图标。
  2. 创建新的 QListWidgetItem 使用 new QListWidgetItem("插入的数据") 创建一个新的 QListWidgetItem 对象,设置了文本为 "插入的数据"。
  3. 设置图标和状态: 使用 setIcon 设置项的图标,setCheckState 设置项的选中状态为选中,setFlags 设置项的状态为可选择、可检查、可启用。
  4. 在指定位置插入项: 使用 ui->listWidget->insertItem(ui->listWidget->currentRow(), aItem) 在当前行的上方插入一个新项。

该槽函数的作用是在列表框的指定位置插入一个新的项,该项包含指定的文本、图标以及初始的选中状态。

  1. void MainWindow::on_pushButton_ins_clicked()
  2. {
  3. QIcon aIcon;
  4. aIcon.addFile(":/image/3.ico");
  5. QListWidgetItem *aItem = new QListWidgetItem("插入的数据");
  6. aItem->setIcon(aIcon);
  7. aItem->setCheckState(Qt::Checked);
  8. aItem->setFlags(Qt::ItemIsSelectable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled);
  9. // 在当前行的上方插入一个项
  10. ui->listWidget->insertItem(ui->listWidget->currentRow(),aItem);
  11. }

运行效果如下图;

1.5 删除列表一行

如下槽函数 on_pushButton_delete_clicked 的核心功能是实现一个“删除选中项”按钮,即删除列表框中当前选中的项。

以下是概述:

  1. 获取当前行: 使用 ui->listWidget->currentRow() 获取当前选中项的行索引。
  2. 移除指定行的项: 使用 ui->listWidget->takeItem(row) 移除指定行的项,该方法返回被移除的项的指针,但不释放空间。
  3. 释放空间: 使用 delete aItem 释放被移除项的空间,确保不发生内存泄漏。

该槽函数的作用是删除列表框中当前选中的项,同时释放相应的内存空间。

  1. void MainWindow::on_pushButton_delete_clicked()
  2. {
  3. // 获取当前行
  4. int row = ui->listWidget->currentRow();
  5. // 移除指定行的项,但不delete
  6. QListWidgetItem *aItem = ui->listWidget->takeItem(row);
  7. // 释放空间
  8. delete aItem;
  9. }

运行效果如下图;

1.6 绑定右键菜单

在之前的内容中我们展示了如何给MainWindow主窗体增加右键菜单,本节我们将给ListWidget增加右键菜单,当用户在ListWidget组件中的任意一个子项下右键,则让其弹出这个菜单,并根据选择提供不同的功能。

首先我们绘制两个UI界面,并通过Tab组件将其分离开,为了方便演示我们需要手动增加列表项内容,增加方法是在ListWidget上面右键并选中编辑项目按钮,此时就可以逐行向列表中录入数据集。

为了增加菜单,我们首先需要在程序全局增加QAction其中每一个QAction则代表一个菜单选项指针,由于我们计划增加三个菜单选项,则此处就保留三个全局菜单指针。

  1. #include <QMenuBar>
  2. #include <QMenu>
  3. #include <QToolBar>
  4. #include <iostream>
  5. // 全局下设置增加删除菜单
  6. QAction *NewAction;
  7. QAction *InsertAction;
  8. QAction *DeleteAction;

首先以右键菜单演示为例,在MainWindow主函数中,首先通过创建顶部菜单并将其设置为隐藏属性,接着通过Connect将每一个子菜单与Action进行连接,代码如下所示;

  1. MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
  2. {
  3. ui->setupUi(this);
  4. // ----------------------------------------------------
  5. // 绘制部分
  6. // ----------------------------------------------------
  7. // 使用 customContextMenuRequested 信号则需要设置
  8. ui->listWidget->setContextMenuPolicy(Qt::CustomContextMenu);
  9. // 隐藏菜单栏上的右击菜单
  10. this->setContextMenuPolicy(Qt::NoContextMenu);
  11. // 创建基础顶部菜单
  12. QMenuBar *bar = menuBar();
  13. this->setMenuBar(bar);
  14. QMenu * fileMenu = bar->addMenu("菜单1");
  15. // 隐藏顶部菜单栏
  16. bar->setVisible(false);
  17. // 添加子菜单
  18. NewAction = fileMenu->addAction("增加IP地址");
  19. InsertAction = fileMenu->addAction("插入IP地址");
  20. DeleteAction = fileMenu->addAction("删除IP地址");
  21. // 分别设置图标
  22. NewAction->setIcon(QIcon(":/image/1.ico"));
  23. InsertAction->setIcon(QIcon(":/image/2.ico"));
  24. DeleteAction->setIcon(QIcon(":/image/3.ico"));
  25. // ----------------------------------------------------
  26. // 绑定槽函数
  27. // ----------------------------------------------------
  28. connect(NewAction,&QAction::triggered,this,[=](){
  29. std::cout << "new action" << std::endl;
  30. });
  31. connect(InsertAction,&QAction::triggered,this,[=](){
  32. std::cout << "insert action" << std::endl;
  33. });
  34. // 以删除为例,演示如何删除选中行
  35. connect(DeleteAction,&QAction::triggered,this,[=](){
  36. int row = ui->listWidget->currentRow();
  37. QListWidgetItem *aItem = ui->listWidget->takeItem(row);
  38. delete aItem;
  39. std::cout << "delete action" << std::endl;
  40. });
  41. }

接着,当ListWidget右键被点击时,则触发on_listWidget_customContextMenuRequested槽函数,在该槽函数内我们通过new QMenu新建菜单,并通过addAction属性将其插入到被点击位置上,其代码如下所示;

  1. // 当listWidget被右键点击时则触发
  2. void MainWindow::on_listWidget_customContextMenuRequested(const QPoint &pos)
  3. {
  4. std::cout << "x pos = "<< pos.x() << "y pos = " << pos.y() << std::endl;
  5. Q_UNUSED(pos);
  6. // 新建Menu菜单
  7. QMenu *ptr = new QMenu(this);
  8. // 添加Actions创建菜单项
  9. ptr->addAction(NewAction);
  10. ptr->addAction(InsertAction);
  11. // 添加一个分割线
  12. ptr->addSeparator();
  13. ptr->addAction(DeleteAction);
  14. // 在鼠标光标位置显示右键快捷菜单
  15. ptr->exec(QCursor::pos());
  16. // 手工创建的指针必须手工删除
  17. delete ptr;
  18. }

运行后读者可自行在特定行上点击右键,此时则会弹出菜单栏,如下图所示;

接着来看下图标组的设置与绑定右键菜单的实现方式,第二种方式的绑定与第一种一致,唯一的区别仅仅只是显示设置上的不同,如下是第二种方法的显示配置代码;

  1. // 第二个ListWidget_使用图标方式展示
  2. ui->listWidget_ico->setViewMode(QListView::IconMode);
  3. // 每一行是一个QListWidgetItem
  4. QListWidgetItem *aItem;
  5. // 设置ICON的图标
  6. QIcon aIcon;
  7. aIcon.addFile(":/image/1.ico");
  8. ui->listWidget_ico->clear();
  9. for(int x=0;x<10;x++)
  10. {
  11. QString str = QString::asprintf("admin_%d",x);
  12. aItem = new QListWidgetItem(); // 新建一个项
  13. aItem->setText(str); // 设置文字标签
  14. aItem->setIcon(aIcon); // 设置图标
  15. //aItem->setCheckState(Qt::Checked); // 设为选中状态
  16. aItem->setFlags(Qt::ItemIsSelectable | // 设置为不可编辑状态
  17. Qt::ItemIsUserCheckable
  18. |Qt::ItemIsEnabled);
  19. ui->listWidget_ico->addItem(aItem); // 增加项
  20. }

使用时只需要按照相同的方式绑定菜单即可,运行效果如下图所示;

完整案例下载

C++ Qt 开发:ListWidget列表框组件的更多相关文章

  1. C/C++ Qt ListWidget 列表框组件应用

    ListWidget列表框组件,该组件与TreeWidget有些相似,区别在于TreeWidget可以实现嵌套以及多字段结构,而ListWidget组件则只能实现单字段结构,ListWidget组件常 ...

  2. C/C++ Qt StringListModel 字符串列表映射组件

    StringListModel 字符串列表映射组件,该组件用于处理字符串与列表框组件中数据的转换,通常该组件会配合ListView组件一起使用,例如将ListView组件与Model模型绑定,当Lis ...

  3. Swing列表框组件

    public class JListTest extends JFrame{    private static final long serialVersionUID=1L;        publ ...

  4. C/C++ Qt 给ListWidget增加右键菜单

    在上一篇博文<C/C++ Qt ListWidget 列表框组件应用>中介绍了ListWidget组件的基本使用技巧,本次将给ListWidget组件增加一个右键菜单,当用户在ListWi ...

  5. 列表框QListWidget类

    QListWidget类也是GUI中常用的类,它从QListView下派生: class Q_GUI_EXPORT QListWidget : public QListView { Q_OBJECT ...

  6. vue3系列:vue3.0自定义弹框组件V3Popup|vue3.x手机端弹框组件

    基于Vue3.0开发的轻量级手机端弹框组件V3Popup. 之前有分享一个vue2.x移动端弹框组件,今天给大家带来的是Vue3实现自定义弹框组件. V3Popup 基于vue3.x实现的移动端弹出框 ...

  7. stark组件开发之列表页面定制列

    先看一张页面展示的效果图: 看一看我的  model 表!是什么样子: 看一看数据库是什么样子: 看 页面展示图,有表头. 有数据.模型表中,每一个字段, 都指定了 verbose_name. 如何解 ...

  8. Java开发笔记(一百三十一)Swing的列表框

    前面介绍了选择框的用法,当时为了方便用户勾勾点点,无论是复选框还是单选按钮,统统把所有选项都摆在界面上.倘若只有两三个选项还好办,要是选项数量变多比如超过五个,这么多的选择框一齐在界面罗列,不光程序员 ...

  9. 【NX二次开发】Block UI 列表框

    属性说明 常规         类型 描述     BlockID     String 控件ID     Enable     Logical 是否可操作     Group     Logical ...

  10. Qt开发环境下载和安装

    Qt是跨平台的图形开发库,目前由Digia全资子公司 Qt Company 独立运营,官方网址: http://www.qt.io/ 也可以访问Qt项目域名:http://qt-project.org ...

随机推荐

  1. Java - ReentrantLock锁分析

    Java - JUC核心类AbstractQueuedSynchronizer(AQS)底层实现 一.  AQS内部结构介绍 JUC是Java中一个包   java.util.concurrent . ...

  2. 《SQL与数据库基础》15. 触发器

    目录 触发器 语法 示例-insert型触发器 示例-update型触发器 示例-delete型触发器 本文以 MySQL 为例 触发器 触发器是与表有关的数据库对象,指在 insert/update ...

  3. 一文了解Validator库

    1. 引言 github.com/go-playground/validator 是一个 Go 语言的库,用于对结构体字段进行验证.它提供了一种简单而灵活的方式来定义验证规则,并在验证过程中检查结构体 ...

  4. CodeForces 1324F Maximum White Subtree

    题意 给定一棵\(n\)个节点的无根树,每个节点为黑色或者白色,每个点的答案为包含该点的子树(指无根子树)的白色节点数减黑色节点数的最大值 分析 对于无根树的题一般指定某一个点为根,不妨设为\(1\) ...

  5. LeetCode买卖股票之一:基本套路(122)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 关于<LeetCode买卖股票>系列 在L ...

  6. 「note」原根照抄

    阶(multiplicative order) \(\textbf{Def.}\):\(\delta_m(a)\) 为最小的 \(n\) 使得 \(a^n\equiv 1\pmod m\),其中 \( ...

  7. C++ bitset 用法和应用

    C++的 bitset 在 bitset 头文件中,它是一种类似数组的结构,它的每一个元素只能是0或1,每个元素仅用1bit空间. 下面是具体用法 构造函数 bitset常用构造函数有四种,如下 bi ...

  8. Tarjan强连通分量详解

    1.简介: 在阅读下列内容之前,请务必了解 图论相关概念 中的基础部分. 强连通的定义是:有向图 G 强连通是指,G 中任意两个结点连通. 强连通分量(Strongly Connected Compo ...

  9. [GXYCTF 2019]Ping Ping Ping

    题目就是ping,而且这还有一个查询窗口,就随便查询试试 ping了一下本地,发现没有什么很大的作用,给出了提示是php可以执行系统函数这就感到神奇了,就还是上网搜了搜 发现可以在查询IP后面进行拼接 ...

  10. .NET开源简单易用、内置集成化的控制台、支持持久性存储的任务调度框架 - Hangfire

    前言 定时任务调度应该是平时业务开发中比较常见的需求,比如说微信文章定时发布.定时更新某一个业务状态.定时删除一些冗余数据等等.今天给推荐一个.NET开源简单易用.内置集成化的控制台.支持持久性存储的 ...