【Qt笔记】QListWidget控件详解

 

目录

引言

一、基本概念和特性

二、基本用法

2.1 创建和初始化

2.2 添加和删除项

2.3 选择和遍历项

三、信号与槽

3.1 itemClicked

3.2 itemDoubleClicked

3.3  itemSelectionChanged

四、自定义项

五、排序和查找

六、代码示例 

6.1 头文件

6.2 源文件 

6.3 主函数文件

6.4 实现效果

6.5 代码解析 

结语


引言

QListWidget 是 Qt 框架中一个非常实用的控件,它提供了一个基于项目的列表视图,允许用户以列表形式展示和交互数据项。这个控件通常用于显示一个字符串列表、图标列表,或者是两者的组合。QListWidget 继承自 QAbstractItemView 和 QListView,但它通过封装简化了列表项的添加、删除和管理过程,使得开发者可以更加容易地实现列表功能。 

一、基本概念和特性

  1. 项目(Items):QListWidget通过QListWidgetItem管理每个列表项。每个项目都可以包含文本、图标、工具提示等。
  2. 选择模式:QListWidget支持多种选择模式,如单选、多选等,可以通过设setSelectionMode来改变。
  3. 排序:列表项可以根据需要进行排序,通过调用 sortItems 方法,并可选地提供一个自定义的比较函数。
  4. 拖拽与放置:QListWidget支持拖拽与放置功能,允许用户通过拖拽重新排序列表项或在不同列表间移动项。
  5. 委托(Delegates):虽然 QListWidget较少直接使用委托,但了解委托机制可以帮助理解如何在更复杂的场景下自定义列表项的显示和编辑。

二、基本用法

2.1 创建和初始化

在 Qt 应用程序中,你可以通过代码或 Qt Designer 来创建QListWidget。以下是通过代码创建并初始化QListWidget的示例:

#include <QListWidget>  
#include <QApplication>  int main(int argc, char *argv[])  
{  QApplication app(argc, argv);  QListWidget listWidget;  listWidget.addItem("Item 1");  listWidget.addItem("Item 2");  listWidget.addItem("Item 3");  listWidget.show();  return app.exec();  
}

在这个例子中,我们首先包含了必要的头文件QListWidget和QApplication。然后,在main函数中创建了一个QApplication对象和一个QListWidget对象。接着,我们通过调用addItem方法向列表中添加了几个项。最后,调用show方法显示列表窗口,并启动事件循环。

2.2 添加和删除项

除了addItem方法外,QListWidget还提供了其他几种添加项的方法,如addItems(添加项列表)、insertItem(在指定位置插入项)、insertItems(在指定位置插入项列表)。删除项可以使用removeItemWidget(根据项的小部件删除)、takeItem(根据索引删除并返回项)。

// 添加多个项  
QStringList items = {"Item 4", "Item 5", "Item 6"};  
listWidget.addItems(items);  // 在特定位置插入项  
listWidget.insertItem(1, "New Item");  // 删除项  
QListWidgetItem* item = listWidget.takeItem(0); // 删除第一个项并返回  
delete item; // 释放内存

2.3 选择和遍历项

你可以通过selectedItems方法获取当前所有被选中的项,或者通过currentItem方法获取当前被选中的项(如果有的话)。遍历所有项可以通过count方法和索引访问器完成。

// 获取所有选中的项  
QList<QListWidgetItem*> selected = listWidget.selectedItems();  
for (QListWidgetItem* item : selected) {  qDebug() << item->text();  
}  // 遍历所有项  
for (int i = 0; i < listWidget.count(); ++i) {  QListWidgetItem* item = listWidget.item(i);  qDebug() << item->text();  
}

三、信号与槽

QListWidget发出多种信号,允许开发者在列表项被选中、添加、删除等事件发生时执行特定的操作。这些信号包括itemClicked、itemDoubleClicked、itemSelectionChanged等。

3.1 itemClicked

列表项单击信号连接对应的槽函数 

connect(&listWidget, &QListWidget::itemClicked, [](QListWidgetItem* item){  qDebug() << "Clicked:" << item->text();  
});  

3.2 itemDoubleClicked

列表项双击信号连接对应的槽函数 

connect(&listWidget, &QListWidget::itemDoubleClicked, [](QListWidgetItem* item){  qDebug() << "Double Clicked:" << item->text();  
});  

3.3  itemSelectionChanged

列表项选择改变信号连接对应的槽函数 

connect(&listWidget, &QListWidget::itemSelectionChanged, [&](){  qDebug() << "Selection changed.";  QList<QListWidgetItem*> selectedItems = listWidget.selectedItems();  qDebug() << "Selected items count:" << selectedItems.size();  
});

四、自定义项

QListWidget允许你通过QListWidgetItem的子类或设置项的图标、文本等来自定义列表项的外观。

QListWidgetItem* item = new QListWidgetItem(QIcon(":/path/to/icon.png"), "Custom Item");  
listWidget.addItem(item);  // 或者设置已存在项的图标和文本  
item->setIcon(QIcon(":/path/to/another_icon.png"));  
item->setText("Updated Item");

五、排序和查找

虽然QListWidget没有直接提供排序方法,但你可以通过移除所有项,然后根据需要对项进行排序后重新添加来实现排序功能。查找项通常通过遍历所有项并比较它们的文本或数据来完成。

六、代码示例 

下面是一个包含QListWidget控件的完整Qt Widgets应用程序示例代码,该代码展示了如何设置QListWidget的基础功能,包括添加项、设置图标、启用多选、处理点击项的槽函数以及基本的样式设置。 

6.1 头文件

自定义了一个类名为MainWindow继承自QWidget 

class MainWindow : public QWidget {Q_OBJECT
public:MainWindow(QWidget *parent = nullptr);private slots:void onItemClicked(QListWidgetItem *item);void addNewItem();void selectAllItems();void deselectAllItems();private:QListWidget *listWidget;QLineEdit *lineEdit;
};

6.2 源文件 

MainWindow::MainWindow(QWidget *parent = nullptr) : QWidget(parent) {auto *layout = new QVBoxLayout(this);// 创建 QListWidget 并设置其属性listWidget = new QListWidget(this);listWidget->setSelectionMode(QListWidget::MultiSelection); // 启用多选// 添加带图标的项QListWidgetItem *item1 = new QListWidgetItem(QIcon(":/path/to/icon1.png"), "项目 1", listWidget);QListWidgetItem *item2 = new QListWidgetItem(QIcon(":/path/to/icon2.png"), "项目 2", listWidget);listWidget->addItem(item1);listWidget->addItem(item2);// 设置样式QString styleSheet = R"(QListWidget {background-color: #f0f0f0; /* 背景色 */border: 1px solid #ccc; /* 边框 */border-radius: 5px; /* 边框圆角 */padding: 5px; /* 内边距 */}QListWidget::item {height: 40px; /* 列表项高度 */}QListWidget::item:selected {background-color: #3399ff; /* 选中项背景色 */color: white; /* 选中项文字颜色 */})";listWidget->setStyleSheet(styleSheet);// 连接点击项的槽函数connect(listWidget, &QListWidget::itemClicked, this, &MainWindow::onItemClicked);// 添加一个按钮作为示例(非必需)QPushButton *button = new QPushButton("添加新项目", this);connect(button, &QPushButton::clicked, this, &MainWindow::addNewItem);// 添加一个lineEdit控件作为项目名字输入lineEdit = new QLineEdit(this);lineEdit->setPlaceholderText("请输入项目名称...");// 设置一个widget包含按钮与lineEdit控件QWidget *wid = new QWidget(this);QHBoxLayout *hlayout = new QHBoxLayout(wid);hlayout->addWidget(lineEdit);hlayout->addWidget(button);// 添加全选和反选按钮QPushButton *selectAllButton = new QPushButton("全选", this);QPushButton *deselectAllButton = new QPushButton("反选", this);connect(selectAllButton, &QPushButton::clicked, this, &MainWindow::selectAllItems);connect(deselectAllButton, &QPushButton::clicked, this, &MainWindow::deselectAllItems);// 设置一个widget包含两个按钮QWidget *wid1 = new QWidget(this);QHBoxLayout *hlayout1 = new QHBoxLayout(wid1);hlayout1->addWidget(deselectAllButton);hlayout1->addWidget(selectAllButton);// 将控件添加到布局中layout->addWidget(listWidget);layout->addWidget(wid);layout->addWidget(wid1);setLayout(layout);
}void MainWindow::onItemClicked(QListWidgetItem *item) {if (item) {qDebug() << "点击了项:" << item->text();}
}void MainWindow::addNewItem() {// 示例:动态添加一个新项目QString newItemText;if(lineEdit->text() == ""){newItemText = QString("新项目 %1").arg(listWidget->count() + 1);}else{newItemText = lineEdit->text();}new QListWidgetItem(QIcon(":/path/to/default_icon.png"), newItemText, listWidget);lineEdit->setText("");
}void MainWindow::selectAllItems() {for (int i = 0; i < listWidget->count(); ++i) {QListWidgetItem *item = listWidget->item(i);if (item) {item->setSelected(true);}}
}void MainWindow::deselectAllItems() {for (int i = 0; i < listWidget->count(); ++i) {QListWidgetItem *item = listWidget->item(i);if (item) {item->setSelected(false);}}
}

6.3 主函数文件

#include "widget.h" // 更换成自己头文件名称
#include <QApplication>int main(int argc, char *argv[]) {QApplication app(argc, argv);MainWindow window;window.resize(400, 300);window.show();return app.exec();
}

6.4 实现效果

 

6.5 代码解析 

  1. 类定义
    • MainWindow类继承自QWidget,包含了一个QListWidget成员变量。
  2. 构造函数
    • 在构造函数中,我们设置了QListWidget的多选模式。
    • 添加了带有图标的列表项。
    • 设置了QListWidget的样式表,以自定义背景色、边框、边框圆角、内边距以及选中项的外观。
    • 连接了itemClicked信号到一个槽函数onItemClicked,该函数在点击列表项时被调用。
    • 添加了一个按钮和QLineEdit控件作为示例,用于演示如何动态添加新项目到列表中。
    • 添加了两个按钮,演示如何一键选中所有列表项和取消选中的所有列表项
  3. 槽函数
    • onItemClicked槽函数在点击列表项时被调用,并打印出被点击项的文本。
    • addNewItem槽函数用于动态添加一个新项目到列表中,这里仅作为示例。
  4. 样式设置
    • 使用setStyleSheet方法为QListWidget设置了CSS样式表。样式表包含了背景色、边框、边框圆角、内边距以及选中项的自定义样式。
  5. 注意事项
    • 请确保替换":/path/to/icon1.png"、":/path/to/icon2.png"和":/path/to/default_icon.png"为你自己的图标文件路径。
    • 如果你使用的是Qt Creator和qmake,则通常不需要包含#include "main.moc"。但是,如果你在纯C++环境中工作(如CMake项目),并且你的.cpp文件中直接包含了Qt的信号和槽,则可能需要手动处理moc的输出。
    • 样式表中的路径是CSS的伪路径,不是文件系统中的实际路径。在Qt中,资源文件(如图标)通常通过资源系统(.qrc文件)管理,并使用:前缀引用。
    • 请确保你的Qt项目文件(.pro)已经包含了必要的Qt模块,如widgets。

结语

QListWidget是 Qt 中一个功能强大的列表控件,它简化了列表项的管理,提供了丰富的API来添加、删除、选择和遍历项。通过信号与槽机制,QListWidget允许开发者在列表项的状态发生变化时执行特定的操作。此外,QListWidget还支持自定义项的外观,以满足不同的界面设计需求。通过上面的介绍和代码示例,你应该已经对QListWidget有了较为全面的了解,并能够在实际项目中灵活运用它。

以上就是关于Qt中QListWidget控件的全部介绍,如有不足与缺陷之处,欢迎评论区留言!!! 

 

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

腾讯云TRTC无UI集成——分享屏幕主流、辅流(Vue2+JS+TRTC无UI集成)

先阐述一下问题&#xff0c;在项目中用到腾讯云的TRTC&#xff0c;A端发布A1、A2两个视频源&#xff0c;在B端订阅A1、A2使用两个view进行播放渲染 问题主流视频源和辅流视频源渲染在同一view上&#xff0c;控制台报错 // 播放远端视频 TRTCService.js; setRemoteVideo(view)…

【数据结构入门】排序算法之插入排序与选择排序

目录 前言 一、排序的概念及运用 1.排序的概念 2.排序的运用 3.常见排序算法 二、插入排序与选择排序 2.1插入排序 2.1.1直接插入排序 1&#xff09;基本思想 2&#xff09;具体步骤 3&#xff09;算法特性 4&#xff09;算法实现 2.1.2希尔排序 1) 基本思想 2&…

草原灭火车的功能与性能_鼎跃安全

在内蒙古的草原火灾中&#xff0c;水陆两栖全地形草原灭火车曾多次用于紧急救援。其强大的越野能力和高速反应&#xff0c;使其在广袤的草原上能够迅速到达火场&#xff0c;并使用集成的多功能灭火设备进行灭火作业&#xff0c;有效防止了火灾的进一步蔓延。 水陆两栖全地形草原…

React学习-hooks

官方文档&#xff1a;https://zh-hans.react.dev/reference/react/useActionState 1.useEffect(setup, dependencies?) 1.1 基础使用 //hooks import { useEffect } from "react"; import "./App.css";function App(){useEffect(()>{console.log(us…

redis的共享session应用

项目背景&#xff1a; 该项目背景就是黑马的黑马点评项目。 一&#xff1a;基于Session实现验证码登录流程 基本的登录流程我们做了很多了。这个是短信登录流程 其实和普通的登录流程就多了一个生成验证码&#xff0c;并将验证码保存在session中&#xff0c;并且呢&#xf…

vue3中使用supermap icilent3d for cesium

记录从头开始学习supermap icilent3d fro cesium 1.新建vue3项目 npm create vitelatest 添加这个&#xff0c;自动打开浏览器 2.使用supermap icilent3d for Cesium 复制这个Cesium&#xff0c;放到pulibc目录下面 然后分别引入css和js 然后就可以使用了&#xff0c;但是会…

Oracle 客户端 PL/SQL Developer 15.0.4 安装与使用

目录 官网下载与安装 切换中文与注册 连接Oracle数据库 tnsnames.ora 文件使用 Oracle 客户端 PL/SQL Developer 12.0.7 安装、数据导出、Oracle 执行/解释计划、for update。 官网下载与安装 1、官网&#xff1a;https://www.allroundautomations.com/products/pl-sql-d…

【STM32】通用定时器TIM(输出比较)

本篇博客重点在于标准库函数的理解与使用&#xff0c;搭建一个框架便于快速开发 目录 前言 输出比较简介 PWM简介 输出比较配置 初始化IO口 输出比较初始化 输出比较代码 PWM.h PWM.c main.c 应用案例 前言 建议先阅读这篇博客&#xff0c;理解时基单元的配置 【…

CDGA|数据治理:构建高效数据管理体系的实践路径

在当今数字化时代&#xff0c;数据已成为企业最宝贵的资产之一&#xff0c;其质量、安全性和有效利用率直接影响着企业的决策能力、运营效率和市场竞争力。因此&#xff0c;数据治理作为确保数据质量、促进数据价值最大化的关键环节&#xff0c;其重要性日益凸显。本文将从几个…

机械学习—零基础学习日志(概率论总笔记1)

概率论的起源 在历史上有明确记载的最早研究随机性的数学家是帕斯卡和费马。帕斯卡就是最早发明机械计算机的那位数学家&#xff0c;他并不是赌徒&#xff0c;但是他有些赌徒朋友&#xff0c;那些人常常玩一种掷骰子游戏&#xff0c;游戏规则是由玩家连续掷4次骰子&#xff0c…

【王树森】Vision Transformer (ViT) 用于图片分类(个人向笔记)

图片分类任务 给定一张图片&#xff0c;现在要求神经网络能够输出它对这个图片的分类结果。下图表示神经网络有40%的信心认定这个图片是狗 ResNet&#xff08;CNN&#xff09;曾经是是图像分类的最好模型在有足够大数据做预训练的情况下&#xff0c;ViT要强于ResNetViT 就是Tr…

(十五)SpringCloudAlibaba-Sentinel持久化到Nacos

前言 在前面我们已经将Sentinel配置的规则持久化到系统的文件中。本章节我们将Sentinel持久化到Nacos中; 传送门(Sentinel数据持久化到文件)https://blog.csdn.net/weixin_45876411/article/details/140742963 默认情况下 Sentinel 只能接收到 Nacos 推送的消息&#xff0c;但…

火情监测识别摄像机

火情监测识别摄像机 是一种用于监测和识别火灾风险的设备&#xff0c;通常用于森林、草原以及其他火灾易发区域。这种摄像机能够实时监测周围的环境&#xff0c;并使用图像识别技术来识别火灾的迹象。 这些摄像机通常配备红外热成像技术和视频分析算法&#xff0c;可以在白天和…

程序二义性举例

// 程序二义性.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 //#include <iostream> using namespace std; void f(int x) {cout << "---" << x << endl;} void f(int x,int y10) {cout << "" &l…

客流预测 | 基于Transformer下车站点客流推断研究(Matlab)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基于Transformer的车站客流推断研究是指利用Transformer模型来预测车站的客流情况。Transformer是一种强大的深度学习模型&#xff0c;特别擅长处理序列数据。研究可以为城市交通管理提供重要决策支持&#xff0c;帮…

【系统分析师】-面向对象方法

目录 1、基本概念 2、UML 2.1、基本结构 2.1.1.构造块 2.1.1.1、事物 2.1.1.2、关系 2.1.1.3、图形 2.1.2.规则 2.1.3.公共机制 2.2、41视图 3、面向对象分析OOA 3.1、用例模型 3.2、分析模型 4、面向对象设计OOD 4.1、细分 4.2、设计原则 5、面向对象的程序设…

传统CV算法——基于harris检测算法实现角点检测

角点 角点是图像中的一个特征点&#xff0c;指的是两条边缘交叉的点&#xff0c;这样的点在图像中通常表示一个显著的几角。在计算机视觉和图像处理中&#xff0c;角点是重要的特征&#xff0c;因为它们通常是图像中信息丰富的区域&#xff0c;可以用于图像分析、对象识别、3D…

大模型(LLM)和知识库的基础介绍

文章目录 概要整体架构流程结合LLM与RAP的优势小结 概要 随着自然语言处理技术的发展&#xff0c;大型语言模型&#xff08;LLM&#xff09;已经成为了人工智能领域中的一个重要组成部分。这些模型通常具有数亿到数千亿个参数&#xff0c;能够理解和生成自然语言&#xff0c;从…

LabVIEW程序员错误排查思路

当LabVIEW程序员在开发过程中遇到难以解决的错误且网上搜不到答案时&#xff0c;需要采取系统性的方法进行排查和解决。这包括回顾代码逻辑、深入理解LabVIEW的底层机制、参考专业文献和求助社区等方式。下面将从多角度详细解读专业程序员在面对这种困境时的应对策略&#xff0…

网络安全等级保护:等级保护工作、分级保护工作、密码管理工作三者之间的关系

上次我整理了一篇文字叫《等级保护、等级保护测评、分级保护测评、密码保护测评之间的区别与联系》&#xff0c;后来发现这种措辞还是存在问题&#xff0c;今天在此重新做个探讨&#xff0c;同时进行更正。我们很多从事信息安全行业的人&#xff0c;交流时常常会提及“等保”“…