效果:
檔案結構:
qcustomwidget.ui
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()<<"雙擊-刪除條目成功";
}