Qt使用QListWidget实现自定义Item

 更新时间:2023年10月22日 13:59:48   作者:FreeLikeTheWind.  
这篇文章主要为大家详细介绍了Qt如何使用QListWidget实现自定义Item的效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

主界面UI

操作流程:

主窗口中央控件是QListWidget,点击添加按钮,会随机向主窗口中央控件中添加自定义item;

选中某条前的可选框,如果选中,点击右侧的删除图标,会弹出提示是否删除;如果不选中,右侧删除图标无法点击;

点击是,删除当前item,点击否,不删除。

实现需解决问题

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

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

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

示例

首先是主窗口代码

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
   Q_OBJECT

public:
   explicit MainWindow(QWidget *parent = nullptr);
   ~MainWindow();

private slots:
   // 添加项
   void 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()
{
   QListWidgetItem* pItem = new QListWidgetItem("");
   ui->listWidget->addItem(pItem);

   custemItem* pCustomItem = new custemItem(pItem);
   ui->listWidget->setItemWidget(pItem, pCustomItem);
   ui->listWidget->setCurrentItem(pItem);

   connect(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_OBJECT

public:
    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的文章就介绍到这了,更多相关Qt QListWidget自定义Item内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++利用GPAC实现生成MP4文件的示例代码

    C++利用GPAC实现生成MP4文件的示例代码

    GPAC主要针对学生和内容创作者,代表了一个跨平台的多媒体框架,开发人员可以使用它在 LGPL 许可下制作开源媒体。本文就来用GPAC实现生成MP4文件,感兴趣的可以了解一下
    2023-02-02
  • 深入分析C++中声明与定义的区别

    深入分析C++中声明与定义的区别

    C++学了这么多年你知道为什么定义类时,类的定义放在.h文件中,而类的实现放在cpp文件中。它们为什么能够关联到一起呢?你知道什么东西可以放在.h文件中,什么不能。什么东西又可以放在cpp文件中。如果你忘记了或是压根就不明白,那么读过此文你会清晰无比!!
    2014-09-09
  • Matlab实现读写txt文件数据与进制转换

    Matlab实现读写txt文件数据与进制转换

    这篇文章主要为大家详细介绍了Matlab实现读写txt文件数据与进制转换的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • C/C++中文件的随机读写详解及其作用介绍

    C/C++中文件的随机读写详解及其作用介绍

    这篇文章主要介绍了C/C++中文件的随机读写详解及其作用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • C++代码实现网络Ping功能

    C++代码实现网络Ping功能

    这篇文章主要介绍了C++代码实现网络Ping功能,Ping命令被送到本地计算机的IP软件,该命令永不退出该计算机,本文给大家介绍的非常详细,需要的朋友参考下吧
    2021-08-08
  • C++ 智能指针深入解析

    C++ 智能指针深入解析

    以下是对C++中智能指针的使用进行了详细的分析介绍,需要的朋友可以参考下
    2013-07-07
  • C++实现单链表删除倒数第k个节点的方法

    C++实现单链表删除倒数第k个节点的方法

    这篇文章主要介绍了C++实现单链表删除倒数第k个节点的方法,结合实例形式分析了C++单链表的定义、遍历及删除相关操作技巧,需要的朋友可以参考下
    2017-05-05
  • VC使用编译时间作为版本号标识的方法

    VC使用编译时间作为版本号标识的方法

    这篇文章主要介绍了VC使用编译时间作为版本号标识的方法,需要的朋友可以参考下
    2017-03-03
  • C语言每日练习之统计文本单词数及高频词

    C语言每日练习之统计文本单词数及高频词

    本文文大家准备了个C语言练习题:统计单词数并找出频率最高的单词,文中的示例代码讲解详细,对我们学习C语言有一定帮助,感兴趣的可以了解一下
    2022-05-05
  • C++17结构化绑定的实现

    C++17结构化绑定的实现

    这篇文章主要介绍了C++17结构化绑定的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05

最新评论