【Qt进阶之自定义控件】使用QListWidget实现自定义Item效果

2023-10-21 19:53

本文主要是介绍【Qt进阶之自定义控件】使用QListWidget实现自定义Item效果,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目的

Q:如何在Qt库的基础上,实现自定义控件呢?
A:根据官方文档回答,就是继承需实现的控件,然后实现自定义功能。

以下是实现QListWidget控件的自定义item。
先看下最终效果是如何:

listItem

主界面UI

操作流程:

  • 主窗口中央控件是QListWidget,点击添加按钮,会随机向主窗口中央控件中添加自定义item;
  • 选中某条前的可选框,如果选中,点击右侧的删除图标,会弹出提示是否删除;如果不选中,右侧删除图标无法点击;
  • 点击,删除当前item,点击,不删除。
    在这里插入图片描述

实现需解决问题

  • 1:如何在QListWidget中添加带有按钮、文本等其它控件的项?

  • 2:选中某项后如何响应?QListWidget自带的item响应为什么不生效?

  • 3:如何选中删除按钮后,通知QListWidget做出删除当前item的操作?

示例

示例中用到的方法,多为控件的成员方法,如需了解更多,可选择某类按F1查阅帮助文档。
首先是主窗口代码
mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:// 项列表控件中添加Itemvoid on_btn_add_clicked();private:Ui::MainWindow *ui;
};#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"#include <QDebug>
#include <custemitem.h>#include <QMessageBox>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_btn_add_clicked()
{// 创建itemQListWidgetItem* pItem = new QListWidgetItem("");ui->listWidget->addItem(pItem);// 创建自定义widgetcustemItem* pCustomItem = new custemItem(pItem);ui->listWidget->setItemWidget(pItem, pCustomItem);ui->listWidget->setCurrentItem(pItem);// 实现自定义信号和槽,当删除时,从列表中删除itemconnect(pCustomItem, &custemItem::emit_del, this, [&](QListWidgetItem* pItem){QMessageBox::StandardButton btn = QMessageBox::information(this, QStringLiteral("提示"), QStringLiteral("是否删除?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);if(QMessageBox::No == btn)return;ui->listWidget->removeItemWidget(pItem);delete pItem;pItem = nullptr;});
}

其次是自定义QWidget控件代码
customitem.h

#ifndef CUSTEMITEM_H
#define CUSTEMITEM_H#include <QWidget>
#include <QListWidgetItem>namespace Ui {
class custemItem;
}class custemItem : public QWidget
{Q_OBJECTpublic:explicit custemItem(QListWidgetItem* pItem, QWidget *parent = nullptr);~custemItem();signals:void emit_del(QListWidgetItem* pItem);private slots:void on_pushButton_clicked();private:Ui::custemItem *ui;QListWidgetItem* m_pItem;
};#endif // CUSTEMITEM_H

customitem.cpp

#include "custemitem.h"
#include "ui_custemitem.h"
#include "defind.h"custemItem::custemItem(QListWidgetItem* pItem, QWidget *parent) :QWidget(parent),ui(new Ui::custemItem),m_pItem(pItem)
{ui->setupUi(this);ui->pushButton->setEnabled(false);// 随机(伪随机)创建一些文本int nRand = qrand()%4;ui->checkBox->setText(slText.at(nRand));ui->checkBox->setIcon(QIcon(slIcon.at(nRand)));// 根据选择状态,来进行删除按钮功能使能connect(ui->checkBox, &QCheckBox::clicked, this, [=](){ui->pushButton->setEnabled(ui->checkBox->isChecked());});
}custemItem::~custemItem()
{delete ui;
}void custemItem::on_pushButton_clicked()
{if(ui->checkBox->isChecked()){emit emit_del(m_pItem);}else{}
}

增加一个随机显示图标和文本的类
defind.h

#ifndef DEFIND_H
#define DEFIND_H#include <QStringList>
#include <QList>
#include <QIcon>
// 随机添加一些文本,使示例看起来更加丰富
QStringList slText = {"12312312.mp3", "dfdafds.mp4", "zcvzcvzxv.txt", "asdfasdfafsafdf.avi"};
QList<QString> slIcon = {":/res/mp3.png", ":/res/mp4.png", ":/res/TXT.png", ":/res/Video.png"};#endif // DEFIND_H

最后是main代码
main.cpp

#include "mainwindow.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}

如果疑问,可留言讨论。

这篇关于【Qt进阶之自定义控件】使用QListWidget实现自定义Item效果的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Java 枚举的基本使用方法及实际使用场景

《Java枚举的基本使用方法及实际使用场景》枚举是Java中一种特殊的类,用于定义一组固定的常量,枚举类型提供了更好的类型安全性和可读性,适用于需要定义一组有限且固定的值的场景,本文给大家介绍Jav... 目录一、什么是枚举?二、枚举的基本使用方法定义枚举三、实际使用场景代替常量状态机四、更多用法1.实现接

python获取cmd环境变量值的实现代码

《python获取cmd环境变量值的实现代码》:本文主要介绍在Python中获取命令行(cmd)环境变量的值,可以使用标准库中的os模块,需要的朋友可以参考下... 前言全局说明在执行py过程中,总要使用到系统环境变量一、说明1.1 环境:Windows 11 家庭版 24H2 26100.4061

springboot项目中使用JOSN解析库的方法

《springboot项目中使用JOSN解析库的方法》JSON,全程是JavaScriptObjectNotation,是一种轻量级的数据交换格式,本文给大家介绍springboot项目中使用JOSN... 目录一、jsON解析简介二、Spring Boot项目中使用JSON解析1、pom.XML文件引入依

Java中的record使用详解

《Java中的record使用详解》record是Java14引入的一种新语法(在Java16中成为正式功能),用于定义不可变的数据类,这篇文章给大家介绍Java中的record相关知识,感兴趣的朋友... 目录1. 什么是 record?2. 基本语法3. record 的核心特性4. 使用场景5. 自定

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

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

Python使用Tkinter打造一个完整的桌面应用

《Python使用Tkinter打造一个完整的桌面应用》在Python生态中,Tkinter就像一把瑞士军刀,它没有花哨的特效,却能快速搭建出实用的图形界面,作为Python自带的标准库,无需安装即可... 目录一、界面搭建:像搭积木一样组合控件二、菜单系统:给应用装上“控制中枢”三、事件驱动:让界面“活”

VSCode设置python SDK路径的实现步骤

《VSCode设置pythonSDK路径的实现步骤》本文主要介绍了VSCode设置pythonSDK路径的实现步骤,包括命令面板切换、settings.json配置、环境变量及虚拟环境处理,具有一定... 目录一、通过命令面板快速切换(推荐方法)二、通过 settings.json 配置(项目级/全局)三、

pandas实现数据concat拼接的示例代码

《pandas实现数据concat拼接的示例代码》pandas.concat用于合并DataFrame或Series,本文主要介绍了pandas实现数据concat拼接的示例代码,具有一定的参考价值,... 目录语法示例:使用pandas.concat合并数据默认的concat:参数axis=0,join=

java中BigDecimal里面的subtract函数介绍及实现方法

《java中BigDecimal里面的subtract函数介绍及实现方法》在Java中实现减法操作需要根据数据类型选择不同方法,主要分为数值型减法和字符串减法两种场景,本文给大家介绍java中BigD... 目录Java中BigDecimal里面的subtract函数的意思?一、数值型减法(高精度计算)1.

C/C++ chrono简单使用场景示例详解

《C/C++chrono简单使用场景示例详解》:本文主要介绍C/C++chrono简单使用场景示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录chrono使用场景举例1 输出格式化字符串chrono使用场景China编程举例1 输出格式化字符串示