效果如下:
列表实现代码如下:
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()
{
}