引入ListIcon代理

This commit is contained in:
WS 2021-08-14 15:50:39 +08:00
parent 03461c6d77
commit 149b0c9369
3 changed files with 89 additions and 4 deletions

View File

@ -5,8 +5,8 @@
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// MainWindow w;
// w.show();
MainWindow w;
w.show();
// DBUnit t;

View File

@ -5,11 +5,14 @@
#include <QSplitter>
#include <QVBoxLayout>
#define GROUP_ITEMSCOUNT Qt::UserRole + 1
#define GROUP_TITLE Qt::DisplayRole
#define GROUP_COVER0 Qt::DecorationRole
#define GROUP_COVER1 Qt::UserRole + 3
#define GROUP_COVER2 Qt::UserRole + 4
#define GROUP_TITLE Qt::DisplayRole
#define GROUP_ITEMSCOUNT Qt::UserRole + 1
#define ITEM_ICON Qt::DecorationRole
#define ITEM_TITLE Qt::DisplayRole
MainWindow::MainWindow(QWidget* parent)
: QMainWindow(parent), groups_view(new QListView(this)),
@ -31,6 +34,9 @@ MainWindow::MainWindow(QWidget* parent)
groups_view->setItemDelegate(new GroupDisplayDelegate);
groups_view->setMovement(QListView::Free);
init_groups_list(groups_list);
init_groups_list(items_list);
items_view->setItemDelegate(new ListIconDelegate());
}
MainWindow::~MainWindow()
@ -104,14 +110,20 @@ GroupDisplayDelegate::paint(QPainter* painter, const QStyleOptionViewItem& optio
auto cover0 = index.data(GROUP_COVER0);
if (cover0.isNull())
cover0 = default_cover->pixmap(QSize(100, 150));
else
cover0 = cover0.value<QIcon>().pixmap(QSize(100, 150));
auto cover1 = index.data(GROUP_COVER1);
if (cover1.isNull())
cover1 = default_cover->pixmap(QSize(100, 150));
else
cover0 = cover0.value<QIcon>().pixmap(QSize(100, 150));
auto cover2 = index.data(GROUP_COVER2);
if (cover2.isNull())
cover2 = default_cover->pixmap(QSize(100, 150));
else
cover0 = cover0.value<QIcon>().pixmap(QSize(100, 150));
auto valid_rect = option.rect - QMargins(15, 15, 15, 15);
@ -142,3 +154,58 @@ GroupDisplayDelegate::sizeHint(const QStyleOptionViewItem& option, const QModelI
{
return QSize(400, 145);
}
ListIconDelegate::ListIconDelegate()
: default_cover(new QIcon(":/imgs/default/cover.jpg"))
{
}
ListIconDelegate::~ListIconDelegate()
{
delete default_cover;
}
void
ListIconDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
drawBackground(painter, option, index);
auto valid_rect = option.rect - QMargins(15, 15, 15, 15);
auto cover = index.data(ITEM_ICON);
if (!cover.isValid())
cover = default_cover->pixmap(100, 150);
else
cover = cover.value<QIcon>().pixmap(QSize(100, 150));
painter->drawPixmap(valid_rect, cover.value<QPixmap>());
}
QSize
ListIconDelegate::sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const
{
return QSize(100, 160);
}
QWidget*
ListIconDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
return new QLineEdit(parent);
}
void
ListIconDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const
{
static_cast<QLineEdit*>(editor)->setText(index.data().toString());
}
void
ListIconDelegate::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const
{
model->setData(index, static_cast<QLineEdit*>(editor)->text());
}
void
ListIconDelegate::updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
editor->setGeometry(option.rect);
}

View File

@ -25,6 +25,24 @@ private:
QIcon* const default_cover;
};
class ListIconDelegate : public QItemDelegate {
public:
ListIconDelegate();
virtual ~ListIconDelegate() override;
// QAbstractItemDelegate interface
public:
virtual void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override;
virtual QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const override;
virtual QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const override;
virtual void setEditorData(QWidget* editor, const QModelIndex& index) const override;
virtual void setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const override;
virtual void updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const override;
private:
QIcon* const default_cover;
};
class MainWindow : public QMainWindow {
Q_OBJECT