news 2026/4/25 7:09:19

【Qt】常用控件(十四)QListWidget的属性和使用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Qt】常用控件(十四)QListWidget的属性和使用

小编个人主页详情<—请点击
小编个人gitee代码仓库<—请点击
Qt系列专栏<—请点击
倘若命中无此运,孤身亦可登昆仑,送给屏幕面前的读者朋友们和小编自己!


目录

    • 前言
    • 一、QListWidget
      • QListWidget的属性
      • 在QListWidget中新增或者删除元素
    • 总结

前言

【Qt】常用控件(十三)QSlider的属性和使用,多元素控件的介绍——书接上文 详情请点击<——
本文由小编为大家介绍——【Qt】常用控件(十四)QListWidget的属性和使用


一、QListWidget

  1. QListWidget属于多元素控件的一种,所以在正式学习QListWidget之前,建议先学习多元素控件的相关知识 关于多元素控件,在第二点多元素控件中进行讲解,详情请点击<——

QListWidget的属性

  1. QListWidget表示一个列表,如上就是一个列表,列表中有很多元素,其中元素也可以成为项,如果列表中的元素过多超出了列表的范围,那么列表会自动开启滚动条,列表中的每一个元素都可以被选中,列表中的每一个元素就被称为一个item,更具体来讲,item是通过QListWidgetItem类来进行表示的,也就是说组成列表的一个一个的元素本质上也就是一个一个的QListWidgetItem类
  2. 下面我们来学习一下QListWidget的相关属性
    (1)currentRow,当前选中的是第几行
    (2)count,一共有几行
    (3)sortingEnabled,是否允许排序
    (4)isWrapping,是否允许换行
    (5)itemAlignment,元素的对齐方式,也就是靠左对齐,靠右对齐,居中对齐 在第四点QLabel设置文本对齐方式中进行的讲解,详情请点击<——

    (6)selectRectVisible,选中的元素矩形是否可见,以上图为例,当选中一项的时候,是否有矩形蓝色的高亮,如果selectRectVisible为false则没有,如果selectRectVisible为true则有
    (7)spacing,元素之间的间隔,这里的元素可以理解为项
  3. 下面我们来认识一下QListWidget的相关方法
    (1)addItem(const QString& label),addItem(QListWidgetItem* item),在列表中添加元素,我们可以看到有两个版本,我们可以使用字符串QString的形式添加,也可以使用QListWidgetItem的形式添加
    (2)currentItem(),返回QListWidgetItem*表示当前选中的元素,从这里我们也可以看出确实列表中的每一个元素都是由一个一个的QListWidgetItem组成的
    (3)setCurrentItem(QListWidgetItem* item),setCurrentItem(int row),设置选中的元素,可以通过传入QListWidgetItem*的方式选中,也可以通过传入int第几行的方式进行选中,关于第几行是从0开始计数的
    (4)insertItem(const QString& label, int row),insertItem(QListWidgetItem* item, int row),在指定行row插入元素,这个元素可是QString类型的,同样也可以是QListWidgetItem类型的
    ……(1)此处的row参数,就表示新的元素在第几行,也就是说把新的元素插入到第几行之前,这里的过程和顺序表的插入十分类似 关于顺序表的插入,在第三点接口的实现的3.9 任意位置的插入进行的讲解,详情请点击<——
    ……(2)那么这里的过程其实也就类似于参加运动会的时候,目前你是第三,当你使劲跑超过了第二的时候,此时你是多少?对,此时咱是第二,所以这里的插入也是类似的道理
    (5)item(int row),返回QListWidgetItem*类型的对象表示第row行的元素
    (6)takeItem(int row),删除指定行的元素,那么在删除指定行元素之后,返回QLIstWidgetItem*表示是哪个元素被删除了,这里值得注意的是take也表示拿走,也有删除的意思,类似的delete,erase,pop,remove都有删除的意思
  4. 下面我们来学习一下QListWidget的相关信号
    (1)currentItemChanged(QListWidgetItem* current, QListWidgetItem* previous),选中不同元素时触发,用于获取具体元素,参数是当前选中的元素current,之前选中元素previous,那么如果第一次进行选择,那么此时没有之前选中的元素,所以此时previous就有可能为空nullptr,所以使用的时候要进行判空
    (2)currentRowChanged(int),选中不同元素时会触发,参数就是当前选中元素的行数,用于获取行号
    (3)itemClicked(QListWidgetItem* item),点击某个元素时触发
    (4)itemDoubleClicked(QListWidgetItem* item),双击某个元素时触发
    (5)itemEntered(QListWidgetItem* item),鼠标悬停在某个元素上时触发
  5. 下面我们来学习QListWidgetItem类的相关方法
    (1)setFont(const QFont& font),设置字体文字样式
    (2)setIcon(const QIcon& icon),设置图标
    (3)setHidden(bool ahide),设置是否隐藏,如果QListWidgetItem被设置为隐藏,那么将不可选,并且不能进行显示
    (4)setSizeHints(const QSize& size),设置QListWidgetItem的尺寸,而QListWidgetItem也就是列表中的一个列,所以也是就设置列表中对应列的大小
    (5)setSelected(bool select),设置是否可以被选中
    (6)setText(const QString& text),设置文本
    (4)setTextAlignment(int alignment),设置文本对齐方式,在第四点QLabel设置文本对齐方式中进行的讲解,详情请点击<——

在QListWidget中新增或者删除元素

  1. 那么我们知道QListWidget是一个列表,那么列表中的每一个元素,每一个项都是一个QListWidgetItem,所以也就意味着我们可以实现对列表进行新增或者插入元素,所以接下来我们创建一个项目名为QListWidget,基类为QWidget,派生类为Widget的项目,接下来我们点击ui文件,进入Qt Designer
  2. 那么小编注意到左侧红框内有列表对应的两个控件分别是List View以及List Widget,其实Qt中的多元素控件之间是可以相互转换的,例如上图,那么我们拖拽一个List View,然后右击QListView,然后点击变型为,此时我们可以看到QListView可以转变为xxxWidget,也可以转变为表格控件,也可以转变为树形控件,那么我们需要的是转变为列表的xxxWidget,所以接下来我们选择QListWidget,此时就可以将QListView转变为QListWidget
  3. 所以此时我们拖拽左侧红框内的控件,然后调整成上图界面即可,那么我们期望在单行输入框中输入字符串之后点击新增就可以新增到列表中,如果选中列表中的某个元素点击删除,就可以直接删除掉,接下来将两个按钮对应的objectName修改右上角的objectName,接下来我们右击,然后点击转到槽,接下来我们选择信号,让Qt帮我们生成对应槽函数的声明和定义
#include"widget.h"#include"ui_widget.h"#include<QDebug>Widget::Widget(QWidget*parent):QWidget(parent),ui(newUi::Widget){ui->setupUi(this);ui->listWidget->addItem("C++");ui->listWidget->addItem("Java");ui->listWidget->addItem("Python");}Widget::~Widget(){deleteui;}voidWidget::on_pushButton_add_clicked(){constQString&text=ui->lineEdit->text();ui->listWidget->addItem(text);}voidWidget::on_pushButton_delete_clicked(){introw=ui->listWidget->currentRow();if(row<0)return;ui->listWidget->takeItem(row);}
  1. 所以此时我们来看,那么在Widget的构造函数中我们使用addItem给列表中添加元素,addItem是有const QString&的版本的,那么此时也就是添加字符串C++,Java,Python,所以此时我们来看新增按钮的clicked信号对应的槽函数,那么逻辑也很简单,就是使用text获取单行输入框的文本,然后使用addItem新增到列表中即可
  2. 接下来我们来看删除按钮的clicked信号对应的槽函数,那么逻辑其实也很简单,此时我们通过currentRow获取当前用户在列表上选中元素对应的行数row,那么如果此时有一个关键,如果用户并没有选择列表上的元素呢?所以此时 currentRow就会返回-1,所以此时使用takeItem删除在列表上行号为-1的元素就会有问题
  3. 所以此时我们要进行判断一下如果row的值小于0,那么我们就直接返回,不用进行删除操作,那么走到下面说明此时row的值大于0,用户选中了列表上的元素,并且按下了删除按钮,要删除列表上行号为row的元素,所以此时我们直接传入行号row调用takeItem删除列表上行号为row的元素即可

运行结果如下

  1. 所以此时默认列表中就含有三个元素C++,Java,Python
  2. 那么在单行输入框中输入字符串之后,点击新增此时就新增到列表中了,如果选中列表中的某个元素点击删除,就可以直接删除掉,无误
  1. 那么其实关于在构造函数中addItem还有另外一种版本,就是参数为QListWidgetItem*的,所以关于这种版本我也想使用一下,如下
#include"widget.h"#include"ui_widget.h"#include<QDebug>Widget::Widget(QWidget*parent):QWidget(parent),ui(newUi::Widget){ui->setupUi(this);// ui->listWidget->addItem("C++");// ui->listWidget->addItem("Java");// ui->listWidget->addItem("Python");ui->listWidget->addItem(newQListWidgetItem("C++"));;ui->listWidget->addItem(newQListWidgetItem("Java"));ui->listWidget->addItem(newQListWidgetItem("Python"));}Widget::~Widget(){deleteui;}voidWidget::on_pushButton_add_clicked(){constQString&text=ui->lineEdit->text();ui->listWidget->addItem(text);}voidWidget::on_pushButton_delete_clicked(){introw=ui->listWidget->currentRow();if(row<0)return;ui->listWidget->takeItem(row);}
  1. 首先QListWidgetItem可以使用字符串进行构造,所以我们使用new去堆上申请QListWidgetItem,然后传参给addItem即可,此时没有问题,那么小编,咱new了之后,没有进行delete,不会存在内存泄露的问题吗?不会存在,此时我们将new的QListWidgetItem交给了QListWidget列表,那么QListWidget列表会帮我们管理一个一个的QListWidgetItem
  2. 别忘了这一个一个的QListWidgetItem组成了QListWidget列表上一个一个的元素,那么QListWidget会在进行释放的时候,首先就会清理它管理的资源,也就是会调用delete去逐个释放列表上一个一个的元素QListWidgetItem,所以此时不会存在内存泄露的问题,那么此时还有一个问题,我们是否可以采用在Widget的构造函数中定义局部对象QListWidgetItem,然后取地址传入QListWidget列表呢?
  3. 不行,一定不行,那么此时一旦出了Widget构造函数的作用域,也就是说Widget的构造函数一旦结束,那么局部的QListWidgetItem生命周期就会结束,所以此时QListWidgetItem就会调用析构函数释放控件对象,即此时会出现“提前释放”的问题,所以程序窗口上的QListWidget列表中也就不会出现对应的QListWidgetItem元素了,而QListWidgetItem元素中存储的字符串自然也就被释放了,即此时初始情况下QListWidget不会显示任何元素了

运行结果如下

  1. 此时使用QListWidgetItem的方式向QListWidget添加元素也可以
  1. 小编,小编,我还有问题,那么当用户点击列表上的元素,我们是否可以感知得到,并且可以将用户当前点击的元素,以及上一次用户点击的元素都打印出来呢?
  2. 可以的,那么我们可以使用currentItemChanged这个信号,所以此时我们点击ui界面,然后鼠标右击QListWidgetItem,点击转到槽,接下来选择currentItemChanged,让Qt帮我们生成槽函数的声明和定义,但是在如下的.h头文件中,关于QListWidgetItem没有进行声明,所以我们需要手动包含一下对应的头文件#include <QListWidgetItem>
#ifndefWIDGET_H#defineWIDGET_H#include<QWidget>#include<QListWidgetItem>QT_BEGIN_NAMESPACEnamespaceUi{classWidget;}QT_END_NAMESPACEclassWidget:publicQWidget{Q_OBJECTpublic:Widget(QWidget*parent=nullptr);~Widget();privateslots:voidon_pushButton_add_clicked();voidon_pushButton_delete_clicked();voidon_listWidget_currentItemChanged(QListWidgetItem*current,QListWidgetItem*previous);private:Ui::Widget*ui;};#endif// WIDGET_H
#include"widget.h"#include"ui_widget.h"#include<QDebug>Widget::Widget(QWidget*parent):QWidget(parent),ui(newUi::Widget){ui->setupUi(this);// ui->listWidget->addItem("C++");// ui->listWidget->addItem("Java");// ui->listWidget->addItem("Python");ui->listWidget->addItem(newQListWidgetItem("C++"));;ui->listWidget->addItem(newQListWidgetItem("Java"));ui->listWidget->addItem(newQListWidgetItem("Python"));}Widget::~Widget(){deleteui;}voidWidget::on_pushButton_add_clicked(){constQString&text=ui->lineEdit->text();ui->listWidget->addItem(text);}voidWidget::on_pushButton_delete_clicked(){introw=ui->listWidget->currentRow();if(row<0)return;ui->listWidget->takeItem(row);}voidWidget::on_listWidget_currentItemChanged(QListWidgetItem*current,QListWidgetItem*previous){if(current!=nullptr)qDebug()<<"当前选中的元素:"<<current->text();if(previous!=nullptr)qDebug()<<"上次选中的元素:"<<previous->text();qDebug();}
  1. currentItemChanged(QListWidgetItem* current, QListWidgetItem* previous),选中不同元素时触发,用于获取具体元素,参数是当前选中的元素current,之前选中元素previous,那么如果第一次进行选择,那么此时没有之前选中的元素,所以此时previous就有可能为空nullptr,所以使用的时候要进行判空
  2. 那么在currentItemChanged对应的槽函数中,那么我们先对current进行判空,如果current不为空,那么我们使用qDebug()进行打印,别忘了current是一个QListWidgetItem指针类型,我们想要打印的是QListWidgetItem中的文本,所以这里并不能直接对current进行打印,而是要使用QListWidgetItem的text方法获取文本,此时再使用qDebug()进行打印即可
  3. 那么同样的道理对于previous我们也要进行判断,如果previous不为空,那么我们使用QListWidgetItem的text方法获取文本,此时再使用qDebug()进行打印即可,那么最后我们再单独使用qDebug()即可,因为如果单独使用qDebug()就表示换行,这样可读性较好

运行结果如下

  1. 所以此时当我们点击列表上的元素,我们就可以感知得到,并且可以将我们当前点击的元素,以及上一次点击的元素都打印出来了,无误
#include"widget.h"#include"ui_widget.h"#include<QDebug>Widget::Widget(QWidget*parent):QWidget(parent),ui(newUi::Widget){ui->setupUi(this);// ui->listWidget->addItem("C++");// ui->listWidget->addItem("Java");// ui->listWidget->addItem("Python");// ui->listWidget->addItem(new QListWidgetItem("C++"));;// ui->listWidget->addItem(new QListWidgetItem("Java"));// ui->listWidget->addItem(new QListWidgetItem("Python"));}Widget::~Widget(){deleteui;}voidWidget::on_pushButton_add_clicked(){constQString&text=ui->lineEdit->text();ui->listWidget->addItem(text);}voidWidget::on_pushButton_delete_clicked(){introw=ui->listWidget->currentRow();if(row<0)return;ui->listWidget->takeItem(row);}voidWidget::on_listWidget_currentItemChanged(QListWidgetItem*current,QListWidgetItem*previous){if(current!=nullptr)qDebug()<<"当前选中的元素:"<<current->text();if(previous!=nullptr)qDebug()<<"上次选中的元素:"<<previous->text();qDebug();}
  1. 如上接下来我们在构造函数中,将使用addItem给列表添加元素的代码注释掉,那么我们是否可以通过图形化的方式给列表添加内容呢?可以的,所以此时我们点击ui文件,进入Qt Designer
  2. 所以此时我们右击QListWidget列表,然后选择编辑项目,此时就进入到了编辑项目的界面,同样的我们也可以直接双击QListWidget列表进入编辑项目的界面,那么在编辑项目中,点击下面的➕️就可以直接添加内容,如果想要删除内容,那么选中要删除的内容点击下面的➖️就可以直接删除内容,那么我们应该如何选择,是通过代码的方式来初始化QListWidget列表,还是通过图形化的方式来初始化QListWidget列表呢?
    (1)如果列表中要初始的内容是固定的,那么我们通过代码或者图形化的方式初始化QListWidget列表都可以
    (2)如果列表中要初始化的内容不固定,内容需要从文件或者网络中来进行获取添加构造到QListWidget列表中,此时只能通过代码的方式来进行添加内容到QListWidget列表进行初始化了

运行结果如下

  1. 如上,那么我们可以看到,通过图形化的方式成功的添加了元素到QListWidget中,无误
  2. 那么至于其他的功能,例如新增,删除等功能,小编在这里就不再进行测试了,在之前的代码例子中小编已经进行了详尽的演示了

总结

以上就是今天的博客内容啦,希望对读者朋友们有帮助
水滴石穿,坚持就是胜利,读者朋友们可以点个关注
点赞收藏加关注,找到小编不迷路!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/25 7:01:21

简单了解Python中的几种函数

几个特殊的函数&#xff08;待补充&#xff09;python是支持多种范型的语言&#xff0c;可以进行所谓函数式编程&#xff0c;其突出体现在有这么几个函数&#xff1a; filter、map、reduce、lambda、yieldlambda12345>>> g lambda x,y:xy #xy,并返回结果>>>…

作者头像 李华
网站建设 2026/4/25 7:00:29

现代Python编程的四个关键点你知道几个

1、Python 中的类型提示Python 最近引入的类型提示语法允许 linter 和第三方代码质量工具在运行前分析你的代码&#xff0c;并在检测出可能发生的错误。你创建的 Python 代码与他人共享的次数越多&#xff0c;大家就越有可能从使用类型提示中受益。Python 的每个后续版本都推出…

作者头像 李华
网站建设 2026/4/25 6:58:58

机器学习优化相变存储器的关键技术解析

1. 相变存储器的技术挑战与机遇相变存储器(PCM)作为新一代非易失性存储技术&#xff0c;近年来在存储领域引起了广泛关注。与传统DRAM相比&#xff0c;PCM具有几个显著优势&#xff1a;首先&#xff0c;它采用硫系化合物材料(如Ge2Sb2Te5)的相变特性存储数据&#xff0c;通过晶…

作者头像 李华