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使用总结 的相关文章

  • 多个源的 makefile

    在学习 make 文件时 我试图为多个源目录编写一个 make 文件 似乎我在某个地方错了 这是我的代码结构 directory common fun2 c inc fun h src fun1 c main c 这是我的生成文件 CC c
  • CMake 找不到请求的 Boost 库

    既然我已经浏览了其他人的解决方案几个小时 但找不到适合我的问题的正确答案 我想将我的具体问题带给您 我正在尝试使用 CMake 构建 vsomeip 为此 我之前构建了 boost 1 55 但是 我在 CMake 中收到以下错误 The
  • json.net自定义jobject反序列化

    我正在尝试使用 JsonConvert DeserializeObject string 将字符串反序列化为可与动态一起使用的 jobject 来动态访问 json 文档 但是我想避免知道文档的大小写 以便我可以输入 dynamic doc
  • Poco c++Net:Http 从响应中获取标头

    我使用 POCO C Net 库进行 http 我想尝试制定持久缓存策略 首先 我认为我需要从缓存标头中获取过期时间 并与缓存值进行交叉检查 如果我错了 请告诉我 那么我如何从中提取缓存头httpResponse 我已经看到你可以用 Jav
  • C++ 长 switch 语句还是用地图查找?

    在我的 C 应用程序中 我有一些值充当代表其他值的代码 为了翻译代码 我一直在争论使用 switch 语句还是 stl 映射 开关看起来像这样 int code int value switch code case 1 value 10 b
  • 有没有办法在 xcode 上使用 c++0x ?我想使用 gcc 4.4 或更高版本

    我想使用 gcc 4 4 或更高版本进行 iphone 开发 有人知道怎么做吗 不 你不知道 相信我 你不会 Apple 仍保留 gcc 4 2 1 因为 4 2 2 及更高版本使用 GPLv3 这意味着他们必须放弃对其平台的控制 对于 i
  • 从模板切换传递的类型

    在 C 中是否可以检查传递给模板函数的类型 例如 template
  • 是否存在指向不同类型的指针具有不同大小的平台?

    C 标准允许指向不同类型的指针具有不同的大小 例如sizeof char sizeof int 是允许的 但是 它确实要求如果将指针转换为void 然后转换回其原始类型 它必须与其原始值进行比较 因此 从逻辑上来说 sizeof void
  • C# 5 async/await 线程机制感觉不对?

    为什么让调用线程进入异步方法直到内部 等待 一旦调用异步方法就生成一个线程 这不是更干净吗 这样您就可以确定异步方法会立即返回 您不必担心在异步方法的早期阶段没有做任何昂贵的事情 我倾向于知道某个方法是否要在 我的 线程上执行代码 不管是堵
  • 为什么'enable_if'不能用于禁用这里声明

    include
  • C# 开源 NMEA 解析器 [已关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找 C 开源 NMEA 解析器 嗯 我自己也不熟悉 但是一些快速搜索显示了一个代码项目 htt
  • 获取 boost Spirit 语法中的当前行

    我正在尝试使用 boostspirit 获取正在解析的文件的当前行 我创建了一个语法类和结构来解析我的命令 我还想跟踪在哪一行找到命令并将其解析到我的结构中 我将 istream 文件迭代器包装在 multi pass 迭代器中 然后将其包
  • MFC:如何设置CEdit框的焦点?

    我正在开发我的第一个简单的 MFC 项目 但我正在努力解决一个问题 想要设置所有的焦点CEdit其中一个对话框中的框 我的想法是 当打开对话框时 焦点位于第一个编辑框上 然后使用 选项卡 在它们之间交换 我看到了方法SetFocus 但我无
  • 为什么 Cdecl 调用在“标准”P/Invoke 约定中经常不匹配?

    我正在开发一个相当大的代码库 其中 C 功能是从 C P Invoked 的 我们的代码库中有很多调用 例如 C extern C int stdcall InvokedFunction int 使用相应的 C DllImport CPlu
  • Project Euler #8,我不明白我哪里出了问题[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在做项目欧拉第八题 https projecteuler net problem 8 其中我得到了这个大得离谱的数字 7316
  • 逆向工程 ASP.NET Web 应用程序

    我有一个 ASP NET Web 应用程序 我没有源代码 该 bin 包含 10 个程序集和一个 compiled 文件 我在 App Code dll 上使用 Reflector 它向我显示了类和命名空间之类的东西 但它太混乱了 有没有什
  • 选择查询不适用于使用Parameters.AddWithValue 的参数

    C 中的以下查询不起作用 但我看不出问题所在 string Getquery select from user tbl where emp id emp id and birthdate birthdate cmdR Parameters
  • CUDA 8 编译错误 -std=gnu++11

    我正在尝试转换一些代码以使用 CUDA 并且我认为我遇到了兼容性问题 我们使用CMake 这些是我使用的 gcc 和 CUDA 版本 gcc version gcc Ubuntu 5 4 0 6ubuntu1 16 04 5 5 4 0 2
  • 为什么以下 C 程序会出现总线错误?

    我认为这是第一个失败的 strtok 调用 好久没写C了 有点不知所措 非常感谢 include
  • 来自 3rd 方库的链接器错误 LNK2019

    我正在将旧的 vc 6 0 应用程序移植到 vs2005 我收到以下链接器错误 我花了几天时间试图找到解决方案 错误LNK2019 无法解析的外部符号 imp 创建AwnService 52 在函数 public int thiscall

随机推荐

  • 干货教你在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后点击移除样本 将样本从列表中移除 点击清空列表 则将列表