QListView实现自定义的控件展示(可以根据选中与否置顶展示)

news2024/11/13 10:11:11

文章目录

  • 0 问题引入
  • 1、方案1:使用QListwidget+自定义的widget
    • 1.1 效果
    • 1.1 思路
  • 2、方案2:使用QListView+自定义model+自定义delegate
    • 2.1.浅谈
    • 2.2.实现
  • 3、总结
  • 4、引用


在这里插入图片描述

0 问题引入

在这里插入图片描述

问题:有人问我如何实现上图的功能,当时我脑海里有了Qlistwidget+自定义litem不就搞定了吗,可是还有选中排序功能,还有可能该列表有上百项(性能问题),该如何解决?实际在探索中还是有点小困难。


1、方案1:使用QListwidget+自定义的widget

看效果:
在这里插入图片描述

1.1 效果

1、实现上图类似的每一行展示的数据
2、点击选中的某一行之后会跳转到最前端
3、未选中的直接放在最后面
基本上满足条件,但是还存在看不见的弊端
1、上述的选中展示到最前端实际上是无奈之举,把那一行删除,然后再最前端插入,这样会导致再实时刷新数据的时候可能会崩溃(虽然也没有)
2、再上百上千条数据的时候有一点慢(虽然也能接收)
3、我想达到的效果是只移动,不删除。

1.1 思路

1、插入一行代码

   QListWidgetItem *pItem = new QListWidgetItem("");     //新增加一个item
   SWidget *sitem = new SlistItem(pItem,name,ischeck);   // SWidget 是自定义的控件,就是每一         
                                                         //行的效果:一个checkbox+若干个label
   listvew->addItem(pItem);
   listvew->setItemWidget(pItem,sitem);

2、实现选中之后到最前端,未选中到最后端:
思路是首先删除改行,然后获取改行的信息,重新new一个item和widget再插入到你想去的位置
引用1文章那样的思路是在删除item的widget保存一份,这个在我这里行不通,必须重新建立,可能是自定义的类型无法转换的问题。


2、方案2:使用QListView+自定义model+自定义delegate

2.1.浅谈

之前用过Qlisttabel的时候遇到过大量数据同时展示的时候,那时候就重新了model类,才勉强接住那个数据刷新,其实一般的速度,原生的就已经够用了。引用文章2里提出的是大致思路。

QListView *listview = new QListView(this);       //创建QListView对象
listview->setGeometry(50, 20, 100, 200);         //设置位置和大小

QStringList list;                                //创建数据显示列表
list.append("苹果");
list.append("香蕉");
list.append("桃子");

//使用数据列表创建数据显示模型
QStringListModel *listmodel = new QStringListModel(list);
listview->setModel(listmodel);                   //设置模型到listview上

listview->setMovement(QListView::Free);          //设置数据可以自由拖动
listview->setSpacing(2);                         //设置数据的间距

2.2.实现

listview使用自定义的model和delegat额也很简单。
伪代码如下(示例):

    listview = new QListView(this);
    model = new CustomListModel();
    delegate = new CustomDelegate();
    listview ->setModel(model);
    listview ->setItemDelegate(delegate);

需要注意的是(根据官网,需要继承QAbstractListModel与以及实现必要的函数)

class CustomListModel : public QAbstractListModel
{
     ///必须实现的函数,可以看官方手册,很详细
    int rowCount(const QModelIndex &parent) const;
    QVariant data(const QModelIndex &index, int role) const;
    bool setData(const QModelIndex &index, const QVariant &value, int role);
 };

class CustomDelegate : public QStyledItemDelegate
{
    //描绘画面显示
    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex   
               &index) const;
    //处理鼠标事件
    bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem 
                     &option, const QModelIndex &index);
};

具体代码不展示了,思路就是这样。代码可以参考引用中的3和4.


3、总结

上述两种方法都没有问题,在实际过程中第二种方法显得麻烦一点,主要是paint函数要把自定义控件给画出来(需要时间和耐心),然后可以根据自己苏旭去渲染,确实提高一些效率,所以酌情去使用,后来我还是使用第一种办法,优化了一些逻辑也是很好的实现效果。


4、引用

1、QListWidget添加自定义Widget后移动Item问题和方法
2、深入浅出 Qt 中 QListView 的设计思想,并掌握大规模、高性能列表的实现方法
3、QListView 自定义delegate和model, 添加checkbox、按钮、文本
4、QListView 使用Delegate定制


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

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

相关文章

kerberos认证流程

kerberos 认证3步骤 1,生活场景 你进入某公司要见领导 首先第一次跟保安打交道,沟通完了,保安告诉你助理的办公室位置和一封信(你看不懂,助理看的懂) 2,你到了助理办公司,助理拿你的…

【LLM微调】Llama3.1-8B模型中文版!OpenBuddy发布新一代跨语言模型

简介: 7月23日,Meta发布了新一代开源模型系列:Llama3.1。其中405B参数的版本刷新了开源模型性能的上限,在多种指标上的测试成绩接近GPT-4等闭源模型的水平,甚至在部分基准测试中展现出来了超越头部闭源模型的潜力。 本…

折叠想象,「天池AI IP形象征集大赛」火热进行中!

天池十周年,我们诚挚邀请各路创作人才围绕「天池平台Al形象」进行创意施展,借助AIGC技术,创造属于天池的独一无二的Al IP形象。我们渴望见到充满“活力、创新、智能〞风格的Al IP设计浮出水面,它将成为天池平台的Al 官方形象&…

Python 中的 NotImplemented 和 NotImplementedError

前言 Python 中的 NotImplemented 和 NotImplementedError 很像,都用来表示没有实现的意思。它们具体有什么区别呢? NotImplemented NotImplemented 是 Python 中的一个特殊常量,注意它不是一个异常类,是一个值。所以它是用在 …

TCP 和 UDP 之间的区别?

从 连接,可靠性,传输方式等方面: TCP 是面向连接的协议,在发送数据的时候需要先通过 TCP 的三次握手,而 UDP 是无连接的协议,可以直接传输数据TCP 通过超时重传,流量控制和拥塞控制等方法保障了…

聚芯前行|美格智能亮相2024 ChinaJoy骁龙主题馆,展现数字娱乐的无限可能

7月26日,2024中国国际数码互动娱乐展览会(ChinaJoy)在上海新国际博览中心正式拉开帷幕。美格智能携手高通公司亮相骁龙主题馆,以5G-A毫米波MiFi解决方案及高算力AI模组,共同为广大玩家和粉丝打造了一个前沿技术赋能、充…

Vivo手机怎么录屏?教你操作,vivo手机完美录屏攻略

随着智能手机的普及,录屏功能成为了我们日常生活和工作中不可或缺的一部分。vivo手机作为一款备受欢迎的智能手机品牌,拥有着许多实用的工具和丰富的功能,其中包括强大的录屏功能。本文将为您详细介绍2种vivo手机怎么录屏的方法。无论您是想分…

找工作很迷茫?程序员的岗位宝典来了!

随着数字化转型进展深入,大量数字化、智能化的岗位相继涌现。 但即使这样,大家依然认为,找到一份合适的工作实在是太!难!了! 调查显示,技术创新和商业模式正在成为助推企业发展的两大动力。同时…

TOSHIBA东芝代理商--芯智雲城,提供订货、报价、选型等服务!

关于东芝 东芝创立于1875年7月,是日本大型半导体制造商,全球知名的综合机电制造商和解决方案提供者,世界大型综合电子电器企业集团。东芝集团原名东京芝浦电气株式会社,在1939年东京电器与芝浦制作所正式合并成为现在的东芝&…

想不到WhaleStudio和Talend的差异竟如此之大!

最近我们遇到很多客户需求是把Talend迁移到WhaleStudio,主要是发现WhaleStudio支持的数据源多很多,从各个版本的SAP到AWS Redshift,S3,从MangoDB CDC到 Neo4J甚至各种国产信创数据源,可谓应有尽有。同时,客…

ROC曲线的一点理解

1 背景知识 真阳率(TPR)和假阳率(FPR): 真阳率(TPR):又称召回率(Recall),计算公式为 ​,表示实际为正的样本中被正确分类为正的比例…

STC12C5A60S2单片机输出pwm的方法

所谓的pwm输出就是让单片机在某个管脚上按照时间输出特定频率和占空比的矩形方波。这里面有两个参数,一是频率,二是占空比。两者互不干涉。以STC12C5A60S2为例子,本51型单片机可以有两路pwm输出。以其中的一路为例说明; 首先说频…

专题八_分治-归并

目录 912. 排序数组 解析 题解 LCR 170. 交易逆序对的总数(数组中的逆序对) 解析 题解 315. 计算右侧小于当前元素的个数 解析 题解 493. 翻转对 解析 题解 912. 排序数组 912. 排序数组 解析 题解 1.局部临时数组 class Solution { public:vector<int> so…

换地不换IP?揭秘微博IP地址的奥秘

在这个信息飞速传递的时代&#xff0c;社交媒体成为我们生活中不可或缺的一部分。微博&#xff0c;作为其中的佼佼者&#xff0c;不仅是我们获取资讯的重要渠道&#xff0c;也是展现自我、分享生活的重要平台。然而&#xff0c;你有没有遇到过这样的情况&#xff1a;明明已经换…

智能相机背后的图像防抖(IS)技术介绍

智能相机背后的图像防抖(IS)技术介绍 在现代摄影和视频拍摄中&#xff0c;防抖技术已成为必不可少的一部分。随着智能手机、相机和其他成像设备的普及&#xff0c;防抖技术的需求也越来越高。本文将详细介绍几种主要的防抖技术&#xff0c;包括光学防抖&#xff08;OIS&#x…

【Redis 初阶】客户端(C++ 使用样例列表)

一、编写 helloworld 需要先使用 redis-plus-plus 连接一下 Redis 服务器&#xff0c;再使用 ping 命令检测连通性。 1、Makefile Redis 库最多可以支持到 C17 版本。&#xff08;如果是用 Centos&#xff0c;需要注意 gcc/g 的版本&#xff0c;看是否支持 C17。不支持的话&a…

【第五节】python异常处理

目录 一、python中的异常用法 1.1 try-except 1.2 异常处理流程&#xff1a; 1.3 try-finally 1.4 使用except是否指定异常 二、异常的参数 三、自定义异常 四、常见的异常列举 一、python中的异常用法 异常是指程序运行过程中出现的非正常状态。在Python编程中&#x…

线程的创建Linux下

进程的创建&#xff1a;第一个参数通常传递一个pthread_t 的地址&#xff0c;第二个参数为线程的属性&#xff0c;第三个参数为函数指针&#xff0c;是子线程要做的事情。arg是函数指针所对应函数的参数。 sleep主要是为了等待子线程退出&#xff0c;因为当主线程退出时&#x…

WebSocket connection to ‘ws://x.x.x.x:8080/ws‘ failed:报错

vue.config.js中进行修改 添加 devServer: { Proxy: {ws:false }}

Flink-StarRocks详解:第二部分(第52天)

文章目录 前言2. 表设计2.1 StarRocks表设计2.1.1 列式存储2.1.2 索引2.1.3 加速处理2.1.3.1 预先聚合2.1.3.2 分区分桶2.1.3.3 物化视图2.1.3.4 列级索引 2.2 数据模型2.2.1 明细模型2.2.1.1 适用场景2.2.1.2 创建表2.2.1.3 使用说明 2.2.2 聚合模型2.2.2.1 适用场景2.2.2.2 原…