Qt中扩展QListWidget支持多列和自定义控件

效果如下:
在这里插入图片描述
列表实现代码如下:

CustomListWidget.h

#ifndef CUSTOMLISTWIDGET_H
#define CUSTOMLISTWIDGET_H

#include <QLabel>
#include <QDialog>
#include <QScrollArea>
#include <QListWidget>
#include <QListWidgetItem>
#include <QMouseEvent>

class CustomListWidgetEx :public QListWidget
{
    
    
    Q_OBJECT

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

public:

    QListWidgetItem* GetItemByWidget(const QWidget *widget) const;

    void InsertItem(int row, QWidget* pWidget, bool flag = false);//true从前面插入,false从后面插入

    void InsertItems(int row, QList<QWidget*> widgetlist, bool flag = false);

    void SetSpacing(int value);

    void AddItem(QWidget *pWidget);

    void RemoveItem(QWidget* pWidget);

    void RemoveItem(int itemId);

    void SetCurrentItem(QWidget* pWidget);

    QList<QWidget*> getListWidget();

    void ClearList();

    int GetListSize();

    int GetCurListRow();

public:
    void setListRows(int nRow);

signals:
    void sig_pullUpImageList(bool nFlag);//true向上,flase向下

private:
    void initObject();
    void initConnect();
    void SetSizeHint(QSize &size);

public:
    QList<QWidget*> m_widgets;

private:
    QSize m_size;
};

#endif // CUSTOMLISTWIDGET_H

CustomListWidget.cpp

#include "customlistwidget.h"
#include <QDebug>
#include <QMovie>
#include <QScrollBar>
#include <QMessageBox>
#include <QVBoxLayout>

QListWidgetItem* CustomListWidgetEx::GetItemByWidget(const QWidget *widget) const
{
    
    
    if (nullptr == widget)
    {
    
    
        return nullptr;
    }
    for (int var = 0; var < this->count(); ++var)
    {
    
    
        QListWidgetItem *pItem = item(var);
        if (pItem)
        {
    
    
            if (widget == this->itemWidget(pItem))
            {
    
    
                return pItem;
            }
        }
    }
    return nullptr;
}

void CustomListWidgetEx::InsertItem(int row, QWidget *pWidget, bool flag)
{
    
    
    if(flag && row > 0)
    {
    
    
        row--;
    }

    QListWidgetItem* pItem = new QListWidgetItem();
    pItem->setSizeHint(m_size);
    this->insertItem(row, pItem);
    this->setItemWidget(pItem, pWidget);

    m_widgets.insert(row, pWidget);
}

void CustomListWidgetEx::InsertItems(int row, QList<QWidget *> widgetlist, bool flag)
{
    
    
    if( widgetlist.size() <= 0 )
    {
    
    
        return;
    }

    if(flag && row > 0)
    {
    
    
        row--;
    }

    for(int i = 0; i < widgetlist.size(); i++)
    {
    
    
        QListWidgetItem* pItem = new QListWidgetItem();
        pItem->setSizeHint(m_size);
        this->insertItem(row, pItem);
        this->setItemWidget(pItem, widgetlist[i]);
        m_widgets.insert(row,widgetlist[i]);
        row += 1;
    }
}

void CustomListWidgetEx::SetSpacing(int value)
{
    
    
    this->setSpacing(value);
}

void CustomListWidgetEx::SetSizeHint(QSize &size)
{
    
    
    if (size == m_size)
    {
    
    
        return;
    }

    m_size = size;

    // 动态移动
    this->doItemsLayout();
}

void CustomListWidgetEx::AddItem(QWidget* pWidget)
{
    
    
    QListWidgetItem* pItem = new QListWidgetItem();
    pItem->setSizeHint(m_size);
    this->addItem(pItem);
    this->setItemWidget(pItem, pWidget);

    m_widgets.append(pWidget);

    this->doItemsLayout();
}

void CustomListWidgetEx::RemoveItem(QWidget *pWidget)
{
    
    
    if( !pWidget )
    {
    
    
        return;
    }

    for(int i = 0; i < this->count(); i++)
    {
    
    
        QListWidgetItem *pItem = this->item(i);
        if( pWidget && (pWidget == itemWidget(pItem) ) )
        {
    
    
            qDebug() << "-----remove-----" << endl;
            this->removeItemWidget(pItem);

            if(pItem)
            {
    
    
                delete pItem;
                pItem = nullptr;
            }

            m_widgets.removeAt(i);
            break;
        }
    }

    this->update();
}

void CustomListWidgetEx::RemoveItem(int itemId)
{
    
    
    if(itemId < 0 || itemId > m_widgets.size())
    {
    
    
        return;
    }

    QListWidgetItem *pItem = this->item(itemId);
    this->removeItemWidget(pItem);

    if( pItem )
    {
    
    
        delete pItem;
        pItem = nullptr;
    }
    m_widgets.removeAt(itemId);
}

void CustomListWidgetEx::ClearList()
{
    
    
    int counter = this->count();

    for(int index = 0; index < counter; index++)
    {
    
    
        QListWidgetItem *item = this->takeItem(0);
        if( item )
        {
    
    
            delete item;
            item = nullptr;
        }

        QWidget* pWgt = m_widgets[index];
        if( pWgt )
        {
    
    
            delete pWgt;
            pWgt = nullptr;
        }
    }

    m_widgets.clear();
}

int CustomListWidgetEx::GetListSize()
{
    
    
    return m_widgets.size();
}

int CustomListWidgetEx::GetCurListRow()
{
    
    
    return this->currentRow();
}

void CustomListWidgetEx::SetCurrentItem(QWidget *pWidget)
{
    
    
    if( !pWidget )
    {
    
    
        return;
    }

    for(int i = 0; i < this->count(); i++)
    {
    
    
        QListWidgetItem *pItem = this->item(i);

        if( pWidget && (pWidget == itemWidget(pItem) ) )
        {
    
    
            setCurrentItem(pItem);
            break;
        }
    }

    this->update();
}

QList<QWidget *> CustomListWidgetEx::getListWidget()
{
    
    
    return m_widgets;
}

CustomListWidgetEx::CustomListWidgetEx(QWidget *parent) : QListWidget(parent)
{
    
    
    initObject();
    initConnect();
    setListRows(3);
}

CustomListWidgetEx::~CustomListWidgetEx()
{
    
    

}

void CustomListWidgetEx::setListRows(int nRow)
{
    
    
    Q_UNUSED(nRow);//暂不支持直接设置列数,通过下列参数自定义
    this->SetSpacing(10);
    this->setFixedSize(380,345);
    this->SetSizeHint(QSize(105,95));
}

void CustomListWidgetEx::initObject()
{
    
    
    this->setSelectionMode(QAbstractItemView::SelectionMode::SingleSelection);
    this->setViewMode(QListView::IconMode);
    this->setFlow(QListWidget::LeftToRight);
    this->setResizeMode(QListView::Adjust);
    this->setMovement(QListView::Static);
    this->setLayoutMode(QListView::SinglePass);
    this->setWrapping(true);
    this->setObjectName("ImageListWgt");
    this->setStyleSheet(
                "QListWidget#ImageListWgt{background:transparent;""border:1px solid rgba(82, 255, 255, 1);"
                "border-left: 3px solid qlineargradient(x0:0, x1:1,"
                "stop: 0 #01001A, stop: 1 rgba(82, 255, 255, 1));"
                "border-bottom: 3px solid qlineargradient(y0:0, y1:1,"
                "stop: 0 rgba(82, 255, 255, 1), stop: 1  #01001A);"
                "border-right: 3px solid qlineargradient(x0:0, x1:1,"
                "stop:  0 rgba(82, 255, 255, 1), stop: 1 #01001A);}"
                "QScrollBar:vertical { border: 1px solid #404040; background: #404040;  width: 3px; border-radius:4px; margin: 0px 0 0px 0;}"
                "QScrollBar:vertical:hover {border: 1px solid 404040;border-radius:4px;background: #404040;border-radius:4px;"
                "width: 9px;margin: 0px 0 0px 0;}"
                "QScrollBar::handle:vertical {background: #4AFFFF;border:0px;border-radius:3px;min-height: 0px;}"
                "QScrollBar::add-line:vertical {border: 0px solid grey;background: #32CC99;height: 0px;subcontrol-position: bottom;"
                "subcontrol-origin: margin;}"
                "QScrollBar::sub-line:vertical {border: 0px solid grey;background: #32CC99;height: 0px;subcontrol-position: bottom;"
                "subcontrol-origin: margin;}"
                "QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical {border: 0px solid grey;width: 0px;height: 0px;"
                "background: #010114;}"
                "QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical {background: none;}"
                "QScrollBar:horizontal {border: 1px solid #404040;background: #0032CC99;height: 9px;margin: 0px 0 0px 0;}"
                "QScrollBar:horizontal:hover {border: 1px solid #404040;border-radius:4px;background: #0032CC99;height: 9px;margin: 0px 0 0px 0;}"
                "QScrollBar::handle:horizontal {background: #3d82ff;border:0px;border-radius:3px;min-height: 0px;}"
                "QScrollBar::add-line:horizontal {border: 0px solid grey;width: 0px;subcontrol-position: right;subcontrol-origin: margin;border: 0px solid black;}"
                "QScrollBar::sub-line:horizontal {background: magenta;width: 0px;subcontrol-position: top right;subcontrol-origin: margin;border: 0px solid black;position: absolute;right: 0px;}"
                "QScrollBar:left-arrow:horizontal, QScrollBar::right-arrow:horizontal {width: 0px;height: 0px;background: pink;}"
                "QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal {background: none;}");


    m_widgets.clear();
}

void CustomListWidgetEx::initConnect()
{
    
    

}

完整demo下载

猜你喜欢

转载自blog.csdn.net/oTianLe1234/article/details/113847088