Qt - QListWidget+QListWidgetItem

[BORUTO]發表於2024-04-30

效果:

Qt - QListWidget+QListWidgetItem

檔案結構:

Qt - QListWidget+QListWidgetItem

qcustomwidget.ui

Qt - QListWidget+QListWidgetItem

qcustomwidget.h (自定義條目類)

#ifndef QCUSTOMWIDGET_H
#define QCUSTOMWIDGET_H

#include <QWidget>

namespace Ui {
class QCustomWidget;
}

class QCustomWidget : public QWidget//聯絡人類
{
    Q_OBJECT

public:
    QCustomWidget(QString name, QString phone, QString picturePath,QWidget *parent = nullptr);
    ~QCustomWidget();

    void initUI();
    void setLable(QString name,QString phone);
    void setBtnObject();
    void setBtmVisible();

protected:
    void enterEvent(QEvent *event);
    void leaveEvent(QEvent *event);


public:
    QString m_name;     //姓名
    QString m_phone;    //電話
    QString m_picturePath;//頭像路徑

    bool flag;

private slots:
    void on_subBtnclicked();
    void on_modBtnclicked();

signals:
    void sig_ClickDelete();
    void sig_ClickModify();

private:
    Ui::QCustomWidget *ui;
};

#endif // QCUSTOMWIDGET_H

qcustomwidget.pp (自定義條目類)

#include "qcustomwidget.h"
#include "ui_qcustomwidget.h"
#include <QDebug>
#include <QMouseEvent>



QCustomWidget::QCustomWidget(QString name, QString phone,QString picturePath,QWidget *parent):QWidget(parent),ui(new Ui::QCustomWidget)
{
    ui->setupUi(this);

    this->m_name = name;
    this->m_phone = phone;
    this->m_picturePath = picturePath;

    this->setFixedWidth(350);

    //ui->mod_Btn->setVisible(false);
    //ui->sub_Btn->setVisible(false);

    initUI();

    connect(ui->mod_Btn, SIGNAL(clicked()), this, SLOT(on_modBtnclicked()));//修改
    connect(ui->sub_Btn, SIGNAL(clicked()), this, SLOT(on_subBtnclicked()));//刪除
}

QCustomWidget::~QCustomWidget()
{
    delete ui;
}


void QCustomWidget::initUI()
{
    ui->name_Label->setText(m_name);
    ui->phone_Label->setText(m_phone);
    QPixmap pix(m_picturePath);
    ui->picture_Label->setScaledContents(true);
    ui->picture_Label->setPixmap(pix);
    ui->mod_Btn->setText("修改");
    ui->sub_Btn->setText("刪除");
}

void QCustomWidget::setLable(QString name,QString phone)
{
    ui->name_Label->setText(name);
    ui->phone_Label->setText(phone);
}

void QCustomWidget::setBtnObject()
{
    ui->mod_Btn->setObjectName("mod_Btn");
    ui->sub_Btn->setObjectName("sub_Btn");
}

void QCustomWidget::enterEvent(QEvent *ev)
{
    setFocus();
    //ui->mod_Btn->setVisible(true);
    //ui->sub_Btn->setVisible(true);
    qDebug()<<"滑鼠進入";
}


void QCustomWidget::leaveEvent(QEvent *event)
{
    setFocusPolicy(Qt::NoFocus);
    //ui->mod_Btn->setVisible(false);
    //ui->sub_Btn->setVisible(false);
    qDebug()<<"滑鼠移出";
}

void QCustomWidget::on_subBtnclicked()
{
    emit sig_ClickDelete();
    qDebug()<<"發射訊號:sig_ClickDelete()";
}

void QCustomWidget::on_modBtnclicked()
{
    emit sig_ClickModify();
    qDebug()<<"發射訊號:sig_ClickModify()";
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QListWidgetItem>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:

    Widget(QWidget *parent = nullptr);
    ~Widget();

    void initListWidget();

public slots:
    void on_itemClicked(QListWidgetItem *item);
    void on_itemDoubleClicked(QListWidgetItem *item);

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include "qcustomwidget.h"
#include <QDebug>

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{
    ui->setupUi(this);
    initListWidget();

    //void itemClicked(QListWidgetItem *item)//當滑鼠按鈕單擊小部件中的專案時,該訊號與指定的專案一起發出。
    //void itemDoubleClicked(QListWidgetItem *item)//當在小部件中的項上雙擊滑鼠按鈕時,此訊號將隨指定項一起發出。
    connect(ui->listWidget, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(on_itemClicked(QListWidgetItem*)));
    connect(ui->listWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(on_itemDoubleClicked(QListWidgetItem*)));
}

Widget::~Widget()
{
    delete ui;
}

void Widget::initListWidget()
{
    //先加入標頭檔案ItemWidget
    //1、例項化一個條目項類的物件
    QListWidgetItem *item = new QListWidgetItem;
    //2、例項化一個自定義條目項介面類的物件
    QCustomWidget *customWidget = new QCustomWidget("張三","123456",":/image/1.jpeg");
    //3、將條目項 新增到 列表控制元件上
    ui->listWidget->addItem(item);
    //4、將當前介面 和 條目項繫結起來
    ui->listWidget->setItemWidget(item,customWidget);
    //5、根據自定義條目項的介面大小  動態 調整 條目項的大小
    item->setSizeHint(customWidget->size());


    //先加入標頭檔案ItemWidget
    //1、例項化一個條目項類的物件
    QListWidgetItem *item1 = new QListWidgetItem;
    //2、例項化一個自定義條目項介面類的物件
    QCustomWidget *customWidget1 = new QCustomWidget("李四","666666",":/image/1.jpeg");
    //3、將條目項 新增到 列表控制元件上
    ui->listWidget->addItem(item1);
    //4、將當前介面 和 條目項繫結起來
    ui->listWidget->setItemWidget(item1,customWidget1);
    //5、根據自定義條目項的介面大小  動態 調整 條目項的大小
    item1->setSizeHint(customWidget1->size());
}


void Widget::on_itemClicked(QListWidgetItem *item)
{
    //item就是我們點選的條目項
    //其實我們想要獲取的是點選的那個條目項所繫結的介面類物件指標
    //ui->listWidget->itemWidget(item)原本是QWidget型別,
    //如果是QWidget *widget = ui->listWidget->itemWidget(item); 就是基類指標指向派生類物件
    //dynamic_cast<ItemWidget*>動態型別轉換成ItemWidget
    QCustomWidget *widget = dynamic_cast<QCustomWidget*>(ui->listWidget->itemWidget(item)) ;
    //widget就是我們選中的條目項的指標,可以獲取裡面的控制元件和資料了
    //例如呼叫介面的一個函式,widget->name();

    qDebug()<<"單擊-"<<widget->m_name<<widget->m_phone;
}

void Widget::on_itemDoubleClicked(QListWidgetItem *item)
{
    //雙擊刪除
    //返回 你要刪除的那個條目項物件指標,需要我們使用者手動刪除
    //1、先獲取你要刪除的條目項的那一行的索引號
    //int row = ui->listWidget->currentRow();
    //2、獲取刪除的條目項
    //QListWidgetItem *delItem = ui->listWidget->takeItem(row);
    //3、刪除
    //delete delItem;

    //刪除列表項的兩種方式:
    //方式一:
    //QListWidgetItem* item = ui->listWidget->currentItem();//獲取當前的列表項
    ui->listWidget->removeItemWidget(item);//移除列表項
    delete item;//刪除列表項

    //方式二:
    //int row = ui->listWidget->currentRow();
    //QListWidgetItem* delitem = ui->listWidget->takeItem(row);
    //delete delitem;

    qDebug()<<"雙擊-刪除條目成功";
}