QListWidget自定義item的兩種方式(二)——使用QWidget作爲item

一. 效果

使用QWidget作爲QListWidget的Item,測試程序效果如下(下面內容包含測試程序源代碼):

 

二. 步驟

使用QWidget作爲QListWidget的Item的步驟如下

1. 定義要作爲QListWidget的Item的自定義的QWidget

class CItemWidget : public QWidget

2. 創建自定義的QWidget並和QListWidget的Item關聯起來

CItemWidget* pItemWidget = new CItemWidget(this);
QListWidgetItem* pItem = new QListWidgetItem();
pItem->setSizeHint(QSize(350, 40));
ui->listWidget->addItem(pItem);
ui->listWidget->setItemWidget(pItem, pItemWidget);

注意:如果要QListWidget的每行顯示多個自定義的QWidget,則需進行下面的設置

ui->listWidget->setResizeMode(QListView::Adjust);
ui->listWidget->setViewMode(QListView::IconMode);

三. 測試程序及效果

ItemWidget.h

#ifndef ITEMWIDGET_H
#define ITEMWIDGET_H

#include <QWidget>

namespace Ui {
class CItemWidget;
}

class CItemWidget : public QWidget
{
    Q_OBJECT

public:
    explicit CItemWidget(QWidget *parent = 0);
    ~CItemWidget();

    //設置數據
    void SetData(const QString& qstrFileName, int iFileSize, const QString& qstrPic);

private:
    Ui::CItemWidget *ui;

};

#endif // ITEMWIDGET_H

ItemWidget.cpp

#include "ItemWidget.h"
#include "ui_ItemWidget.h"

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

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

void CItemWidget::SetData(const QString& qstrFileName, int iFileSize, const QString& qstrPic)
{
    ui->label_fileName->setText(qstrFileName);
    ui->label_fileSize->setText(QString::number(iFileSize));

    QPixmap pixmapPic(qstrPic);
    int iWidth = ui->label_pic->width();
    int iHeight = ui->label_pic->height();
    QPixmap pixmapPicFit = pixmapPic.scaled(iWidth, iHeight, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);//飽滿填充
    ui->label_pic->setPixmap(pixmapPicFit);
}

MainWidget.h

#ifndef MAINWIDGET_H
#define MAINWIDGET_H

#include <QWidget>

namespace Ui {
class CMainWidget;
}

class CMainWidget : public QWidget
{
    Q_OBJECT

public:
    explicit CMainWidget(QWidget *parent = 0);
    ~CMainWidget();

private:
    Ui::CMainWidget *ui;

    //添加Item
    void AddItem(const QString& qstrFileName, int iFileSize, const QString& qstrPic);
};

#endif // MAINWIDGET_H

MainWidget.cpp

#include "MainWidget.h"
#include "ui_MainWidget.h"
#include "ItemWidget.h"

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

    ui->listWidget->setResizeMode(QListView::Adjust);
    ui->listWidget->setViewMode(QListView::IconMode);

    AddItem("Video1", 1024, ":/images/video_1.png");
    AddItem("Video2", 2048, ":/images/video_2.png");
    AddItem("Video3", 3072, ":/images/video_3.png");
    AddItem("Video4", 4096, ":/images/video_4.png");
    AddItem("Video5", 5120, ":/images/video_1.png");
}

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

void CMainWidget::AddItem(const QString& qstrFileName, int iFileSize, const QString& qstrPic)
{
    CItemWidget* pItemWidget = new CItemWidget(this);
    pItemWidget->SetData(qstrFileName, iFileSize, qstrPic);
    QListWidgetItem* pItem = new QListWidgetItem();
    pItem->setSizeHint(QSize(350, 40));
    ui->listWidget->addItem(pItem);
    ui->listWidget->setItemWidget(pItem, pItemWidget);
}

main.cpp

#include "MainWidget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    CMainWidget w;
    w.show();

    return a.exec();
}

程序運行效果如下:

 

 

相關資料:

QListWidget自定義item的兩種方式(一)——使用Delegate

自定義QWidget作爲QListWidget的Item時偶爾出現位置偏移問題的解決方法和原理

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章