QT 如何在 QListWidget 的选项中插入自定义组件

有时我们需要 QListWidget  完成更复杂的操作,而不仅限于添加文本或者图标,那么就会使用到 setItemWidget 函数,但是这也会伴生一个问题,插入自定义组件后,QListWidget  对选项点击事件的获取会收到阻塞,因为点击会有概率落到我们的自定义组件上,这时候我们可以这样解决该问题:

方案1:

组件1 *1 = new 组件1(组件有点击信号)
组件2 *2 = new 组件2(组件有点击信号)
QListWidgetItem *temporary_item1 = new QListWidgetItem();
QListWidgetItem *temporary_item2 = new QListWidgetItem();
QListWidget->addItem(temporary_item);
QListWidget->setItemWidget(temporary_item1, 1);
QListWidget->addItem(temporary_item2);
QListWidget->setItemWidget(temporary_item2, 2);
connect(1, &组件1::点击信号, this, [&](){LF_favoriteList->item(1)->setSelected(true);});
connect(2, &组件2::点击信号, this, [&](){LF_favoriteList->item(2)->setSelected(true);});

这样我们就可以通过组件的点击信号来手动触发 QListWidget 的点击事件,选中选项,但是问题也很明显,如果选项非静态的话呢?静态的情况下麻烦一点一个一个写好放进去就ok了,动态的话行不通,这就使用到方案2了

方案2(推荐->适用更复杂的自定义组件):

void MediaLogicGO::favoraListLoad(QString text, QString logo_path){
    Nwidget *temporary = new Nwidget();
    temporary->setAttribute(Qt::WA_DeleteOnClose);
    QHBoxLayout *temHbox = new QHBoxLayout(temporary);
    NLabel * favora_logo = new NLabel(temporary);
    NLineEdit *lineEdit = new NLineEdit(temporary);
    NLabel *favora_rename = new NLabel(temporary);
    NLabel *favora_remove = new NLabel(temporary);
    favora_rename->setSyncEnable(true);
    favora_remove->setSyncEnable(true);
    favora_logo->setSyncEnable(true);
    favora_logo->setFixedHeight(23);
    favora_rename->setFixedHeight(23);
    favora_remove->setFixedHeight(23);
    favora_logo->setAdjustFixedWidth(true);
    favora_rename->setAdjustFixedWidth(true);
    favora_remove->setAdjustFixedWidth(true);
    favora_rename->setdrawType(NT::DRAWTYPE_ROUND);
    favora_remove->setdrawType(NT::DRAWTYPE_ROUND);
    favora_rename->setSyncPixdrawType(NT::DRAWTYPE_RECT, 3);
    favora_remove->setSyncPixdrawType(NT::DRAWTYPE_RECT, 3);
    favora_rename->setSyncBackColorOption({{WIN_MOUSE_ATTRIBUTE.WIN_ENTER, QColor(255,255,255,230)}});
    favora_remove->setSyncBackColorOption({{WIN_MOUSE_ATTRIBUTE.WIN_ENTER, QColor(255,255,255,230)}});
    favora_logo->setPixmapC(logo_path);
    favora_rename->setPixmapC(":/PIXMAP/bench/private-rename.png");
    favora_remove->setPixmapC(":/PIXMAP/bench/private-remove.png");
    lineEdit->setStyleSheet("QLineEdit{background:transparent; border:0px; color:rgba(89,89,89,200); font:12px;}");
    lineEdit->setReadOnly(true);
    lineEdit->setText(text);
    temHbox->addWidget(favora_logo);
    temHbox->addWidget(lineEdit);
    temHbox->addWidget(favora_rename);
    temHbox->addWidget(favora_remove);
    temHbox->setAlignment(Qt::AlignVCenter);
    temHbox->setContentsMargins(0,0,0,0);
    temHbox->setSpacing(0);
    QListWidgetItem *temporary_item = new QListWidgetItem();
    LF_favoriteList->addItem(temporary_item);
    LF_favoriteList->setItemWidget(temporary_item, temporary);
    temporary->setObjectName(QString::number(RdoMap_Integer["Favora-item-addtion"]));
    lineEdit->setObjectName(QString::number(RdoMap_Integer["Favora-item-addtion"]));
    favora_logo->setObjectName(QString::number(RdoMap_Integer["Favora-item-addtion"]));
    favora_rename->setObjectName(QString::number(RdoMap_Integer["Favora-item-addtion"]));
    favora_remove->setObjectName(QString::number(RdoMap_Integer["Favora-item-addtion"]));
    connect(temporary, &Nwidget::msnm_rls, this, [&](QString name){LF_favoriteList->item(name.toInt())->setSelected(true);});
    connect(lineEdit, &NLineEdit::msnm_rls, this, [&](QString name){LF_favoriteList->item(name.toInt())->setSelected(true);});
    connect(favora_logo, &NLabel::msnm_rls, this, [&](QString name){LF_favoriteList->item(name.toInt())->setSelected(true);});
    connect(favora_rename, &NLabel::msnm_rls, this, [&](QString name){LF_favoriteList->item(name.toInt())->setSelected(true);favoraItemAction(1);});
    connect(favora_remove, &NLabel::msnm_rls, this, [&](QString name){LF_favoriteList->item(name.toInt())->setSelected(true);favoraItemAction(0);});
    RdoMap_Integer["Favora-item-addtion"] += 1;
}

如以上实例代码,我们添加了一个由logo图标,文本框,两个操作按钮的自定义组件,并给他们做了信号连接,正常情况下,QListWidget 选项会被自定义组件遮挡一部分,非遮挡部分正常点击选中

 例如左图这个情况,大概率是全部遮挡了,那么为了解决这个问题,我们把自定义组件、以及组件中的文本框、logo、重命名和删除组件 的点击事件做一个信号连接,把对象名称传出来,对象名称我们就设置该组件的行数,以此手动触发选项的选中事件,其中重命名按钮和删除按钮触发选项的选中还触发该组件的点击,目的是为了避免已经操作了按钮但是选项并没有选中的尴尬情况

效果:

既然触发了选项的点击,那就好办了,使用 QListWidget 的 itemSelectionChanged 信号获取选中数据,这里我获取文本框的文本,也可以获取 QListWidgetItem 或者 选中的行,对应操作需要什么数据就获取什么

void MediaLogicCT::priLiswItemChange(/*QListWidgetItem *Item*/){
    QList<QListWidgetItem*> items = LF_favoriteList->selectedItems();
    QList<QString> texts;
    foreach(QListWidgetItem *item, items)
    {
        int item_row = LF_favoriteList->row(item);
        NLineEdit *edit = LF_favoriteList->itemWidget(item)->findChild<NLineEdit*>(QString::number(item_row));
        QString text = edit->text();
        texts.append(text);
    }

    qDebug() << "当前选项" << texts.last();
    qDebug() << "所选选项" << texts;
    RdoMap_String["list-text"] = texts.last();
}


下面是操作按钮对应的函数
void MediaLogicGO::favoraItemAction(int Type){
    switch (Type) {
        case 0:
            qDebug() << RdoMap_String["list-text"] << "选项即将删除";
            在这里编写删除的逻辑代码
            break;
        case 1:
            qDebug() << RdoMap_String["list-text"] << "选项即将重命名";
            在这里编写删除的逻辑代码
            break;
    }  
}

完成,以上仅仅是个示例,按这个思路写就行了

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣SQL50 员工奖金 连表查询 isnull(xx)

Problem: 577. 员工奖金 字段 is nullisnull(字段) Code select e.name,b.bonus from Employee e left join Bonus b on e.empId b.empId # where isnull(b.bonus) or b.bonus < 1000; where b.bonus is null or b.bonus < 1000;

高中数学:解三角形相关公式总结及用法总结

一、正弦定理 二、余弦定理 三、三角形面积公式 由正弦定理&#xff0c;可以推出三角形的面积公式&#xff1a; S*ab*sinC S*ac*sinB S*bc*sinA 四、使用方法总结 五、练习 例题1 解析 对条件等式进行变形&#xff0c;结合余弦定理&#xff0c;求出∠A的度数&#xff0c;从而…

目标检测算法综述

1 研究背景 1.1 概述 目标检测是计算机视觉的重要分支&#xff0c;主要任务是在给定的图片中精确找到物体所在位置&#xff0c;并标注出物体的类别&#xff0c;即包含了目标定位与目标分类两部分。在计算机视觉领域中的目标跟踪、图像分割、事件检测、场景理解等的任务都以目标…

Go 编程风格指南 - 最佳实践

Go 编程风格指南 - 最佳实践 原文&#xff1a;https://google.github.io/styleguide/go 概述 | 风格指南 | 风格决策 | 最佳实践 注意&#xff1a; 本文是 Google Go 风格 系列文档的一部分。本文档是 规范性(normative) 但不是强制规范(canonical)&#xff0c;并且从属于Goo…

通用代码生成器应用场景五:任意需求应用急就章

通用代码生成器应用场景五&#xff1a;任意需求应用急就章 在中国文化中&#xff0c;如果您在任何的政府&#xff0c;商业或者私人事务上需要表明身份。您需要一枚自己的私章。如果在必须的场合&#xff0c;您没有此私章。如果您知道如何刻写图章&#xff0c;可以临时使用普通的…

淘宝扭蛋机小程序:为市场带来了新的发展机遇

随着互联网的快速发展&#xff0c;大众的消费方式也逐渐向线上转移&#xff0c;越来越多的消费者喜欢上了电商购物&#xff0c;电商时代已然到来。 在互联网时代背景下&#xff0c;扭蛋机市场也得到了改变&#xff0c;线上淘宝扭蛋机小程序以电商的模式进入了大众的生活中&…

正邦科技(day3)

出厂测试 设备校准 这个需要注意的是校准电流、电压、电感的时候有时候负感器会装反&#xff0c;mcu会坏&#xff0c;需要flash一下清空内存

微信小程序分销商城源码系统 区域代理+收银台+兑换中心 功能强大 附带完整的安装代码包以及搭建教程

系统概述 微信小程序分销商城源码系统是一款基于微信小程序平台开发的电商系统&#xff0c;旨在为商家提供全方位的电商解决方案。该系统采用先进的技术架构&#xff0c;支持多平台、多终端访问&#xff0c;能够满足不同商家的业务需求。系统拥有简洁明了的用户界面和丰富的功…

半导体光子电学期末笔记1: 电磁光学基本理论

Chapter 2: 电磁光学基本理论 电磁光学理论概述 真空中麦克斯韦方程组[p9] 在自由空间中&#xff0c;麦克斯韦方程组可以写成如下形式&#xff1a; { ∇ H ϵ 0 ∂ E ∂ t (1) ∇ E − μ 0 ∂ H ∂ t (2) ∇ ⋅ E 0 (3) ∇ ⋅ H 0 (4) \begin{cases} \nabla \times \…

GPT-4o:人工智能技术的新里程碑

在人工智能领域&#xff0c;技术的不断演进为我们带来了许多惊喜。最近&#xff0c;GPT-4o横空出世&#xff0c;成为了人工智能技术的新里程碑。在这篇博客中&#xff0c;我们将对GPT-4o进行评价&#xff0c;并进行版本间的对比分析&#xff0c;探讨其技术能力以及个人整体感受…

SSMP整合案例第八步 前端页面的分页功能完善与维护和实现条件查询

分页 页面中有分页展示 查看组件 想用什么直接编辑 vue里面的常量数据 可以修改模型数据达到修改展示效果的能力 先在前端进入的时候加载分页数据 //钩子函数&#xff0c;VUE对象初始化完成后自动执行 created() {//加载全部数据// this.getAll();//加载分页数据this.getPag…

香橙派OrangePI AiPro测评 【运行qt,编解码,xfreeRDP】

实物 为AI而生 打开盒子 配置 扛把子的 作为业界首款基于昇腾深度研发的AI开发板&#xff0c;Orange Pi AIpro无论在外观上、性能上还是技术服务支持上都非常优秀。采用昇腾AI技术路线&#xff0c;集成图形处理器&#xff0c;拥有8GB/16GB LPDDR4X&#xff0c;可以外接32…

数据库系列之MySQL数据库Varchar类型尾部空值问题

背景&#xff1a;研发人员在执行SQL语句“select xx from tb where c1’aaa ’”查询时&#xff0c;发现并不能只查询出’aaa ’这样的字符串&#xff0c;而是把所有’aaa’这样的查出来。首先不管开发人员在插入数据的时候有没有进行去掉首尾字符串的处理&#xff0c;在MySQL …

基于RNN和Transformer的词级语言建模 代码分析 _generate_square_subsequent_mask

基于RNN和Transformer的词级语言建模 代码分析 _generate_square_subsequent_mask flyfish Word-level Language Modeling using RNN and Transformer word_language_model PyTorch 提供的 word_language_model 示例展示了如何使用循环神经网络RNN(GRU或LSTM)和 Transforme…

开源大模型框架概览3.1 TensorFlow与Keras3.1.1 TensorFlow简介

1.背景介绍 3.1 TensorFlow与Keras TensorFlow是Google Brain team在2015年发布的一个开源库&#xff0c;支持large-scale machine learning and deep neural networks。Keras是Python neural network library&#xff0c;它最初是由Franois Chollet开发的&#xff0c;并于20…

传统IT运维方式在数字化转型和业务扩展背景下面临哪些挑战?

近年来&#xff0c;IT部门的运维人员面对不断涌现的新兴技术和架构转型的要求&#xff0c;如企业上云中台互联网、分布式、容器化、双中心双活&#xff0c;大数据、人工智能的应用等等。随着传统企业把更多的业务向数字化转型&#xff0c;传统的IT运维方式在数字化转型和业务扩…

小程序抓包详细教程

小程序抓包详细教程 前言&#xff1a;关于小程序抓包一直想写出一个比较详细的教程 实验设备&#xff1a; ​ 微信: https://windows.weixin.qq.com/?langzh_CN ​ Proxifier&#xff1a;https://www.proxifier.com/download/ (需要挂梯子访问下载) ​ burpsuite&#xff…

电源滤波器怎么选怎么用1

电源滤波器怎么选怎么用 第一步第二步第三步第四步 很多人不懂得选型&#xff0c;都是买一大堆在现场直接挨个挨个测试&#xff0c;哪一个是通过了就算哪一个。是的我也是这样子搞得。那如何选择最优、最经济、最实用、最有效的滤波器呢&#xff1f;选择电源滤波器的过程有这么…

BioPorto胰高血糖素样肽-1抗体(GLP-1)

丹麦BioPorto Diadnostics公司致力于提供世界领先的GLP-1抗体。基于结合GLP-1位点的不同&#xff0c;他们筛选出了不同的抗GLP-1抗体。有的抗体可以同时结合GLP-1的活性形式和非活性形式&#xff0c;有的专门结合生物活性形式的GLP-1。在开发和检测GLP-1相关治疗的过程中&#…

初探Flask:Pycharm社区版创建Flask项目

文章目录 一、创建工程二、引入Flask库1.使用命令行安装Flask2.在PyCharm中安装Flask 三、创建Flask框架基本文件四、运行项目 本文将带您一步步创建一个简单的Flask项目&#xff0c;包括设置Python环境、安装Flask库以及创建基本的项目结构。 一、创建工程 首先&#xff0c;确…