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

2024-06-03 06:44

本文主要是介绍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;}  
}

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

这篇关于QT 如何在 QListWidget 的选项中插入自定义组件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1026243

相关文章

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

Qt QCustomPlot库简介(最新推荐)

《QtQCustomPlot库简介(最新推荐)》QCustomPlot是一款基于Qt的高性能C++绘图库,专为二维数据可视化设计,它具有轻量级、实时处理百万级数据和多图层支持等特点,适用于科学计算、... 目录核心特性概览核心组件解析1.绘图核心 (QCustomPlot类)2.数据容器 (QCPDataC

Java实现自定义table宽高的示例代码

《Java实现自定义table宽高的示例代码》在桌面应用、管理系统乃至报表工具中,表格(JTable)作为最常用的数据展示组件,不仅承载对数据的增删改查,还需要配合布局与视觉需求,而JavaSwing... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

一文详解Java Stream的sorted自定义排序

《一文详解JavaStream的sorted自定义排序》Javastream中的sorted方法是用于对流中的元素进行排序的方法,它可以接受一个comparator参数,用于指定排序规则,sorte... 目录一、sorted 操作的基础原理二、自定义排序的实现方式1. Comparator 接口的 Lam

Qt如何实现文本编辑器光标高亮技术

《Qt如何实现文本编辑器光标高亮技术》这篇文章主要为大家详细介绍了Qt如何实现文本编辑器光标高亮技术,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录实现代码函数作用概述代码详解 + 注释使用 QTextEdit 的高亮技术(重点)总结用到的关键技术点应用场景举例示例优化建议

Qt 设置软件版本信息的实现

《Qt设置软件版本信息的实现》本文介绍了Qt项目中设置版本信息的三种常用方法,包括.pro文件和version.rc配置、CMakeLists.txt与version.h.in结合,具有一定的参考... 目录在运行程序期间设置版本信息可以参考VS在 QT 中设置软件版本信息的几种方法方法一:通过 .pro

如何自定义一个log适配器starter

《如何自定义一个log适配器starter》:本文主要介绍如何自定义一个log适配器starter的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求Starter 项目目录结构pom.XML 配置LogInitializer实现MDCInterceptor

Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析

《Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析》InstantiationAwareBeanPostProcessor是Spring... 目录一、什么是InstantiationAwareBeanPostProcessor?二、核心方法解

Python中bisect_left 函数实现高效插入与有序列表管理

《Python中bisect_left函数实现高效插入与有序列表管理》Python的bisect_left函数通过二分查找高效定位有序列表插入位置,与bisect_right的区别在于处理重复元素时... 目录一、bisect_left 基本介绍1.1 函数定义1.2 核心功能二、bisect_left 与