【Qt】常用控件(十四)QListWidget的属性和使用
小编个人主页详情—请点击小编个人gitee代码仓库—请点击Qt系列专栏—请点击倘若命中无此运孤身亦可登昆仑送给屏幕面前的读者朋友们和小编自己!目录前言一、QListWidgetQListWidget的属性在QListWidget中新增或者删除元素总结前言【Qt】常用控件十三QSlider的属性和使用多元素控件的介绍——书接上文 详情请点击——本文由小编为大家介绍——【Qt】常用控件十四QListWidget的属性和使用一、QListWidgetQListWidget属于多元素控件的一种所以在正式学习QListWidget之前建议先学习多元素控件的相关知识 关于多元素控件在第二点多元素控件中进行讲解详情请点击——QListWidget的属性QListWidget表示一个列表如上就是一个列表列表中有很多元素其中元素也可以成为项如果列表中的元素过多超出了列表的范围那么列表会自动开启滚动条列表中的每一个元素都可以被选中列表中的每一个元素就被称为一个item更具体来讲item是通过QListWidgetItem类来进行表示的也就是说组成列表的一个一个的元素本质上也就是一个一个的QListWidgetItem类下面我们来学习一下QListWidget的相关属性1currentRow当前选中的是第几行2count一共有几行3sortingEnabled是否允许排序4isWrapping是否允许换行5itemAlignment元素的对齐方式也就是靠左对齐靠右对齐居中对齐 在第四点QLabel设置文本对齐方式中进行的讲解详情请点击——6selectRectVisible选中的元素矩形是否可见以上图为例当选中一项的时候是否有矩形蓝色的高亮如果selectRectVisible为false则没有如果selectRectVisible为true则有7spacing元素之间的间隔这里的元素可以理解为项下面我们来认识一下QListWidget的相关方法1addItem(const QString label)addItem(QListWidgetItem* item)在列表中添加元素我们可以看到有两个版本我们可以使用字符串QString的形式添加也可以使用QListWidgetItem的形式添加2currentItem()返回QListWidgetItem*表示当前选中的元素从这里我们也可以看出确实列表中的每一个元素都是由一个一个的QListWidgetItem组成的3setCurrentItem(QListWidgetItem* item)setCurrentItem(int row)设置选中的元素可以通过传入QListWidgetItem*的方式选中也可以通过传入int第几行的方式进行选中关于第几行是从0开始计数的4insertItem(const QString label, int row)insertItem(QListWidgetItem* item, int row)在指定行row插入元素这个元素可是QString类型的同样也可以是QListWidgetItem类型的……1此处的row参数就表示新的元素在第几行也就是说把新的元素插入到第几行之前这里的过程和顺序表的插入十分类似 关于顺序表的插入在第三点接口的实现的3.9 任意位置的插入进行的讲解详情请点击——……2那么这里的过程其实也就类似于参加运动会的时候目前你是第三当你使劲跑超过了第二的时候此时你是多少对此时咱是第二所以这里的插入也是类似的道理5item(int row)返回QListWidgetItem*类型的对象表示第row行的元素6takeItem(int row)删除指定行的元素那么在删除指定行元素之后返回QLIstWidgetItem*表示是哪个元素被删除了这里值得注意的是take也表示拿走也有删除的意思类似的deleteerasepopremove都有删除的意思下面我们来学习一下QListWidget的相关信号1currentItemChanged(QListWidgetItem* current, QListWidgetItem* previous)选中不同元素时触发用于获取具体元素参数是当前选中的元素current之前选中元素previous那么如果第一次进行选择那么此时没有之前选中的元素所以此时previous就有可能为空nullptr所以使用的时候要进行判空2currentRowChanged(int)选中不同元素时会触发参数就是当前选中元素的行数用于获取行号3itemClicked(QListWidgetItem* item)点击某个元素时触发4itemDoubleClicked(QListWidgetItem* item)双击某个元素时触发5itemEntered(QListWidgetItem* item)鼠标悬停在某个元素上时触发下面我们来学习QListWidgetItem类的相关方法1setFont(const QFont font)设置字体文字样式2setIcon(const QIcon icon)设置图标3setHidden(bool ahide)设置是否隐藏如果QListWidgetItem被设置为隐藏那么将不可选并且不能进行显示4setSizeHints(const QSize size)设置QListWidgetItem的尺寸而QListWidgetItem也就是列表中的一个列所以也是就设置列表中对应列的大小5setSelected(bool select)设置是否可以被选中6setText(const QString text)设置文本4setTextAlignment(int alignment)设置文本对齐方式在第四点QLabel设置文本对齐方式中进行的讲解详情请点击——在QListWidget中新增或者删除元素那么我们知道QListWidget是一个列表那么列表中的每一个元素每一个项都是一个QListWidgetItem所以也就意味着我们可以实现对列表进行新增或者插入元素所以接下来我们创建一个项目名为QListWidget基类为QWidget派生类为Widget的项目接下来我们点击ui文件进入Qt Designer那么小编注意到左侧红框内有列表对应的两个控件分别是List View以及List Widget其实Qt中的多元素控件之间是可以相互转换的例如上图那么我们拖拽一个List View然后右击QListView然后点击变型为此时我们可以看到QListView可以转变为xxxWidget也可以转变为表格控件也可以转变为树形控件那么我们需要的是转变为列表的xxxWidget所以接下来我们选择QListWidget此时就可以将QListView转变为QListWidget所以此时我们拖拽左侧红框内的控件然后调整成上图界面即可那么我们期望在单行输入框中输入字符串之后点击新增就可以新增到列表中如果选中列表中的某个元素点击删除就可以直接删除掉接下来将两个按钮对应的objectName修改右上角的objectName接下来我们右击然后点击转到槽接下来我们选择信号让Qt帮我们生成对应槽函数的声明和定义#includewidget.h#includeui_widget.h#includeQDebugWidget::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(){constQStringtextui-lineEdit-text();ui-listWidget-addItem(text);}voidWidget::on_pushButton_delete_clicked(){introwui-listWidget-currentRow();if(row0)return;ui-listWidget-takeItem(row);}所以此时我们来看那么在Widget的构造函数中我们使用addItem给列表中添加元素addItem是有const QString的版本的那么此时也就是添加字符串CJavaPython所以此时我们来看新增按钮的clicked信号对应的槽函数那么逻辑也很简单就是使用text获取单行输入框的文本然后使用addItem新增到列表中即可接下来我们来看删除按钮的clicked信号对应的槽函数那么逻辑其实也很简单此时我们通过currentRow获取当前用户在列表上选中元素对应的行数row那么如果此时有一个关键如果用户并没有选择列表上的元素呢所以此时 currentRow就会返回-1所以此时使用takeItem删除在列表上行号为-1的元素就会有问题所以此时我们要进行判断一下如果row的值小于0那么我们就直接返回不用进行删除操作那么走到下面说明此时row的值大于0用户选中了列表上的元素并且按下了删除按钮要删除列表上行号为row的元素所以此时我们直接传入行号row调用takeItem删除列表上行号为row的元素即可运行结果如下所以此时默认列表中就含有三个元素CJavaPython那么在单行输入框中输入字符串之后点击新增此时就新增到列表中了如果选中列表中的某个元素点击删除就可以直接删除掉无误那么其实关于在构造函数中addItem还有另外一种版本就是参数为QListWidgetItem*的所以关于这种版本我也想使用一下如下#includewidget.h#includeui_widget.h#includeQDebugWidget::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(){constQStringtextui-lineEdit-text();ui-listWidget-addItem(text);}voidWidget::on_pushButton_delete_clicked(){introwui-listWidget-currentRow();if(row0)return;ui-listWidget-takeItem(row);}首先QListWidgetItem可以使用字符串进行构造所以我们使用new去堆上申请QListWidgetItem然后传参给addItem即可此时没有问题那么小编咱new了之后没有进行delete不会存在内存泄露的问题吗不会存在此时我们将new的QListWidgetItem交给了QListWidget列表那么QListWidget列表会帮我们管理一个一个的QListWidgetItem别忘了这一个一个的QListWidgetItem组成了QListWidget列表上一个一个的元素那么QListWidget会在进行释放的时候首先就会清理它管理的资源也就是会调用delete去逐个释放列表上一个一个的元素QListWidgetItem所以此时不会存在内存泄露的问题那么此时还有一个问题我们是否可以采用在Widget的构造函数中定义局部对象QListWidgetItem然后取地址传入QListWidget列表呢不行一定不行那么此时一旦出了Widget构造函数的作用域也就是说Widget的构造函数一旦结束那么局部的QListWidgetItem生命周期就会结束所以此时QListWidgetItem就会调用析构函数释放控件对象即此时会出现“提前释放”的问题所以程序窗口上的QListWidget列表中也就不会出现对应的QListWidgetItem元素了而QListWidgetItem元素中存储的字符串自然也就被释放了即此时初始情况下QListWidget不会显示任何元素了运行结果如下此时使用QListWidgetItem的方式向QListWidget添加元素也可以小编小编我还有问题那么当用户点击列表上的元素我们是否可以感知得到并且可以将用户当前点击的元素以及上一次用户点击的元素都打印出来呢可以的那么我们可以使用currentItemChanged这个信号所以此时我们点击ui界面然后鼠标右击QListWidgetItem点击转到槽接下来选择currentItemChanged让Qt帮我们生成槽函数的声明和定义但是在如下的.h头文件中关于QListWidgetItem没有进行声明所以我们需要手动包含一下对应的头文件#include QListWidgetItem#ifndefWIDGET_H#defineWIDGET_H#includeQWidget#includeQListWidgetItemQT_BEGIN_NAMESPACEnamespaceUi{classWidget;}QT_END_NAMESPACEclassWidget:publicQWidget{Q_OBJECTpublic:Widget(QWidget*parentnullptr);~Widget();privateslots:voidon_pushButton_add_clicked();voidon_pushButton_delete_clicked();voidon_listWidget_currentItemChanged(QListWidgetItem*current,QListWidgetItem*previous);private:Ui::Widget*ui;};#endif// WIDGET_H#includewidget.h#includeui_widget.h#includeQDebugWidget::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(){constQStringtextui-lineEdit-text();ui-listWidget-addItem(text);}voidWidget::on_pushButton_delete_clicked(){introwui-listWidget-currentRow();if(row0)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();}currentItemChanged(QListWidgetItem* current, QListWidgetItem* previous)选中不同元素时触发用于获取具体元素参数是当前选中的元素current之前选中元素previous那么如果第一次进行选择那么此时没有之前选中的元素所以此时previous就有可能为空nullptr所以使用的时候要进行判空那么在currentItemChanged对应的槽函数中那么我们先对current进行判空如果current不为空那么我们使用qDebug()进行打印别忘了current是一个QListWidgetItem指针类型我们想要打印的是QListWidgetItem中的文本所以这里并不能直接对current进行打印而是要使用QListWidgetItem的text方法获取文本此时再使用qDebug()进行打印即可那么同样的道理对于previous我们也要进行判断如果previous不为空那么我们使用QListWidgetItem的text方法获取文本此时再使用qDebug()进行打印即可那么最后我们再单独使用qDebug()即可因为如果单独使用qDebug()就表示换行这样可读性较好运行结果如下所以此时当我们点击列表上的元素我们就可以感知得到并且可以将我们当前点击的元素以及上一次点击的元素都打印出来了无误#includewidget.h#includeui_widget.h#includeQDebugWidget::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(){constQStringtextui-lineEdit-text();ui-listWidget-addItem(text);}voidWidget::on_pushButton_delete_clicked(){introwui-listWidget-currentRow();if(row0)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();}如上接下来我们在构造函数中将使用addItem给列表添加元素的代码注释掉那么我们是否可以通过图形化的方式给列表添加内容呢可以的所以此时我们点击ui文件进入Qt Designer所以此时我们右击QListWidget列表然后选择编辑项目此时就进入到了编辑项目的界面同样的我们也可以直接双击QListWidget列表进入编辑项目的界面那么在编辑项目中点击下面的➕️就可以直接添加内容如果想要删除内容那么选中要删除的内容点击下面的➖️就可以直接删除内容那么我们应该如何选择是通过代码的方式来初始化QListWidget列表还是通过图形化的方式来初始化QListWidget列表呢1如果列表中要初始的内容是固定的那么我们通过代码或者图形化的方式初始化QListWidget列表都可以2如果列表中要初始化的内容不固定内容需要从文件或者网络中来进行获取添加构造到QListWidget列表中此时只能通过代码的方式来进行添加内容到QListWidget列表进行初始化了运行结果如下如上那么我们可以看到通过图形化的方式成功的添加了元素到QListWidget中无误那么至于其他的功能例如新增删除等功能小编在这里就不再进行测试了在之前的代码例子中小编已经进行了详尽的演示了总结以上就是今天的博客内容啦,希望对读者朋友们有帮助水滴石穿坚持就是胜利读者朋友们可以点个关注点赞收藏加关注找到小编不迷路