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

相关文章

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

Vue中组件之间传值的六种方式(完整版)

《Vue中组件之间传值的六种方式(完整版)》组件是vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用,针对不同的使用场景,如何选择行之有效的通信方式... 目录前言方法一、props/$emit1.父组件向子组件传值2.子组件向父组件传值(通过事件形式)方

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

基于Spring实现自定义错误信息返回详解

《基于Spring实现自定义错误信息返回详解》这篇文章主要为大家详细介绍了如何基于Spring实现自定义错误信息返回效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录背景目标实现产出背景Spring 提供了 @RestConChina编程trollerAdvice 用来实现 HTT

Qt 中 isHidden 和 isVisible 的区别与使用小结

《Qt中isHidden和isVisible的区别与使用小结》Qt中的isHidden()和isVisible()方法都用于查询组件显示或隐藏状态,然而,它们有很大的区别,了解它们对于正确操... 目录1. 基础概念2. 区别清见3. 实际案例4. 注意事项5. 总结1. 基础概念Qt 中的 isHidd

SpringSecurity 认证、注销、权限控制功能(注销、记住密码、自定义登入页)

《SpringSecurity认证、注销、权限控制功能(注销、记住密码、自定义登入页)》SpringSecurity是一个强大的Java框架,用于保护应用程序的安全性,它提供了一套全面的安全解决方案... 目录简介认识Spring Security“认证”(Authentication)“授权” (Auth

Spring组件初始化扩展点BeanPostProcessor的作用详解

《Spring组件初始化扩展点BeanPostProcessor的作用详解》本文通过实战案例和常见应用场景详细介绍了BeanPostProcessor的使用,并强调了其在Spring扩展中的重要性,感... 目录一、概述二、BeanPostProcessor的作用三、核心方法解析1、postProcessB

QT移植到RK3568开发板的方法步骤

《QT移植到RK3568开发板的方法步骤》本文主要介绍了QT移植到RK3568开发板的方法步骤,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录前言一、获取SDK1. 安装依赖2. 获取SDK资源包3. SDK工程目录介绍4. 获取补丁包二