Qt每日小结——QListWidget使用总结

2023-10-31

最近需要使用QListWidget完成一个样本输入显示及交互的功能
需要实现的功能基本是这样的:


点击添加样本 将txt文件名输入到左侧的列表中
单击、shift/ctrl多选item后点击移除样本  将样本从列表中移除
点击清空列表,则将列表中的list清空
注:这里只涉及文件名的显示与删除,不涉及文件的读写
基本上涉及到了QListWidget的很多基础用法 ,总结如下
(由于添加样本且不允许重复打开文件,这个功能相对删除文件稍微复杂一些,因此先解释如何实现删除文件)
一、移除选中的文件

先上代码:

/**
 * @brief KNNDlg::on_deleteSpfiles_clicked删除选中的样本文件
 */
void KNNDlg::on_deleteSpfiles_clicked()
{


    QList <QListWidgetItem*> items ;//注意 items是个Qlist 其中的元素是QListWidgetItem
    items=ui->SPList->selectedItems();
    if(items.size()==0)
        return;
    else
    {
        for(int i =0; i<items.size(); i++)//遍历所算的ITEM
        {
            QListWidgetItem*sel = items[i];
            int r = ui->SPList->row(sel);
            delete  ui->SPList->takeItem(r);

        }
        //下面代码可实现删除单选的item
        //    QListWidgetItem *item = ui->SPList->takeItem(ui->SPList->currentRow());
        //    delete item;
    }
}

原理很简单 有几点需要注意

1、删除Item 需要使用函数takeItem 而不是removeItemWidget

2、由于我们要实现的是删除选中的文件 ,需要使用到selectedItems这个函数

这个函数返回的是QList<QListWidgetItem>格式 因此,我们再保存所选中的文件时需要声明一个这样的对象

3、注意takeItem()这个函数,他的参数是int row ,因此我们需要先读取每个item的row然后 执行takeItem 将这个Item和listWidget 脱离关系

之后用delete来删除

4、是否能多选 可以通过代码进行设置,但是我是通过ui文件直接拖入的控件,所以直接在ListWidget的属性里将selectionMode改为多选模式


二、清空list

这个和删除选中文件是原理是一样的 widget调用一个selectAll()即可

三、向ListWidget中添加文件

代码如下

/**
 * @brief KNNDlg::on_InputSP_clicked 输入样本文件
 */
void KNNDlg::on_InputSP_clicked()
{
    spFileNames=QFileDialog::getOpenFileNames(this,"样本文件选择","C:\\Users\\gaohan\\Desktop\\GF-5_2\\train data","TXT FILE(*.txt);;SHP FILE(*.shp);;All files(*.*)");


    if (spFileNames.length()==0)
    {
        QMessageBox::information(NULL,"样本文件选择 ","未添加样本文件.");
    }


    nspfcount=spFileNames.count();
    spfcount=ui->SPList->count();
    if(spfcount>0)//为防止重复加入,列表不为空时,用新加入的文件遍历列表中的文件 如果有相同的 则提示并返回
    {
        for(int i=0;i<spfcount; i++)
        {
            for(int j=0;j<nspfcount;j++)
            {
                if(spFileNames.value(j)==ui->SPList->item(i)->text())// 注意 这里用==
                {
                    QMessageBox::information(NULL,"样本文件选择",tr("%1     此样本文件已添加").arg(spFileNames.value(j)));
                    return;
                }
            }
        }


        ui->SPList->insertItems(0,spFileNames);

    }
    else
    {
        ui->SPList->insertItems(0,spFileNames);//将样本文件名在listWidget中显示
    }


}


向ListWIdget中插入item本来很简单,使用insterItem即可解决,

有一个问题是当我重复加入一个文件时,提示我此文件已加入过

使用QFileDialog::getOpenFileNames返回的值保存在QStringList中 (要新加入的文件名)

而ListWidget中保存的是Item(已有的文件名); 两者无法直接对比,而对于小白的我,对两个类的函数又不熟悉

因此走了不少弯路(譬如说还尝试过将打开的文件名累积保存在一个QStringList 中,利用其removeDuplicates()来去重,但实际操作中会产生很多bug)

但最后还是试出来来了 也就是QString的value和item的text() 将新加入的文件名和已存在的文件名一个一个进行对比,如果相同 则提示已加入

效果如下:



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt每日小结——QListWidget使用总结 的相关文章

  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲

随机推荐

  • 干货教你在PostgreSql中使用JSON字段

    通过本文可掌握在pg数据库中如何正确使用json字段 如何进行数据查询 在where子查询中如何使用 以及对json值进行聚合查询使用 概述 JSON 代表 JavaScript Object Notation JSON是开放的标准格式 由
  • SCAU OJ综合性实验

    在当前目录中存在文件名为 case1 in 其中case后为数字1 不是字母l 写错提交后会判错 的文本文件 其内容为一篇英文文章 以EOF作为结束标志 现要求读取该文本文件内容 统计文章中每个单词出现的次数 并输出出现次数最多的前5个单词
  • 理解 以太坊Serenity - 第一部分: 深度抽象

    Origin post by Vitalik Buterin on December 24th 2015 我们已经公开继续改进以太坊协议的计划和长期开发路线图相当长一段时间了 这个做法也是来自于从1 0版本发布之前或者事后没有能及时处理的错
  • 迅捷fw325r虚拟服务器设置,Fast迅捷FW325R无线路由器设置

    新购买的Fast迅捷FW325R无线路由器要怎么设置呢 其实关于迅捷FW325R无线路由器的设置方法跟其它以falogin cn为默认登录地址的迅捷无线路由器是一样的 首先我们要做的就是正确的安装迅捷FW325R无线路由器 其次 查看电脑的
  • SpringBoot+MybatisPlus+Druid 配置多数据源

    项目上要用到多数据源 发现MybatisPlus从配置到切换数据源有一套快捷的实现 便选用了MybatisPlus的多数据源配置 本文的 dynamic datasource spring boot starter 与 mybatis pl
  • 如何理解和编程实现证据理论的Dempster组合规则?

    由于CSDN编公式太麻烦 我就先在文档里写好 然后转成图片了 OK 接下来我们来一段代码 把上述过程实现了 clear all Matlab code for Dempster s combinatonal rule in belief f
  • zynq ALSA

    设计参考的代码PS和PL端的下载链接如下 linuxkernel版本号4 4 基于Zedboard 的ADAU1761功放芯片 ADI公司kernel和hdlgit链接地址 Took Linux device tree is include
  • 镁光闪存颗粒对照表_内存颗粒型号识别

    容量 MB Samsung 三星 ETRON 钰创 Zentel 力积 Hynix 海力士 Elpida 尔必达 2MB N A EM636165TS 6G N A N A 8MB K4S641632N EM638165TS 6G A3V6
  • 面向对象以及特点

    历史 汇编语言 C语言 对象过程化 C Java javaScript Python PHP 面向对象编程思想 三大特征 1 抽象 封装 抽象是指强调实体的本质 内在的属性 在系统开发中 抽象指的是在决定如何实现对象之前的对象的意义和行为
  • 32通过tcp发送数组_西门子S71500与S7300PN的TCP通信(图文)

    加微信号 15021230050 邀请您加入 信控电气 微信群 点击文章最下方 阅读原文 加入超级工控技术群 免费学习PLC编程技术 包吃住还有工资 西门子S7 1500与S7 300PN的TCP通信 1 概述 2 自动化解决方案 2 1网
  • 摆动排序leetcode324

    给你一个整数数组 nums 将它重新排列成 nums 0 lt nums 1 gt nums 2 lt nums 3 的顺序 你可以假设所有输入数组都可以得到满足题目要求的结果 示例 1 输入 nums 1 5 1 1 6 4 输出 1 6
  • 【单片机】STM32F030硬件SPI的坑

    使用的是STM32F030F4P6 这是一个小封装的单片机 但是五脏俱全 很多功能 就是引脚不多 使用到SPI的时候感觉应该和以前用过的STM32F103系列是一样的 寄存器的结构几乎是完全一样的 寄存器操作的程序甚至都能兼容 但是在使用的
  • Flutter1.0实践要点(Dart语法回顾)

    Flutter1 0实践要点 Flutter 文档 Flutter widgets文档 实践要点 dart文件命名使用小写加下滑线 dart类命名使用驼峰 Dart语法 绝对定位widget Stack Positioned url包裹wi
  • A Survey of Learning on Small Data(二)

    本文是 A Survey of Learning on Small Data 的翻译 原文链接 小数据学习综述 4 几何角度 4 1 Frechet均值 4 2 欧几里得均值 4 3 非欧均值 4 3 1 Poincare质心 4 3 2
  • 面试常问:Hive分区与分桶的区别

    分区表与分桶表的区别 创建表时可以同时为表创建一个或者多个分区 我们在加载数据时为期指定具体的 分区 查询数据时可以指定具体的分区从而提高效率 分区表是把分区当成目录的 分区实际上是将表文件分成多个有标记的小文件以方便查询 分区表 在Hiv
  • Ubuntu下安装AndroidStudio

    前言 接触Ubuntu系统有一段时间了 对Ubuntu下软件的操作有了一定的了解 本文结合所学的知识 在Ubuntu系统下安装android开发工具 Android Studio 步骤 第一步 安装JDK 打开终端 使用快捷键 CTR AL
  • Result of ‘Stream.peek()‘ is ignored

    firstPublish getFunds stream filter firstFund gt adviceCodeSet contains firstFund getCode peek firstFund gt firstFund se
  • 不要再焦虑了:BATJ大厂给程序员们价值百万的职业规划(18-35岁,35岁以后)

    顺坡下山 另辟蹊径 虽然你感觉互联网程序员好像已经人满为患了 但中国很多其他行业还根本招不到什么像样的程序员的 只是现在制造业国企程序员待遇太低 一般也就万把块 比制造业其他工种稍微高一点 但比互联网低很多 只要肯降薪去这些国企央企 也算一
  • 浅论静态测试的价值

    曾经看过一篇介绍某静态测试工具的文章 说该工具可以发现所有的代码错误 我觉得很好奇 问 如果我写了一个加法函数 把加号写成减号 如int add int a int b return a b 可以找出来吗 答 这是代码功能错误 当然不能找出
  • Qt每日小结——QListWidget使用总结

    最近需要使用QListWidget完成一个样本输入显示及交互的功能 需要实现的功能基本是这样的 点击添加样本 将txt文件名输入到左侧的列表中 单击 shift ctrl多选item后点击移除样本 将样本从列表中移除 点击清空列表 则将列表