From 149b0c9369bd93e0867f62ec64a205fc69d7ad2b Mon Sep 17 00:00:00 2001 From: WS <2422523675@qq.com> Date: Sat, 14 Aug 2021 15:50:39 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BC=95=E5=85=A5ListIcon=E4=BB=A3=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.cpp | 4 +-- mainwindow.cpp | 71 ++++++++++++++++++++++++++++++++++++++++++++++++-- mainwindow.h | 18 +++++++++++++ 3 files changed, 89 insertions(+), 4 deletions(-) diff --git a/main.cpp b/main.cpp index 1f881a7..f51e2d1 100644 --- a/main.cpp +++ b/main.cpp @@ -5,8 +5,8 @@ int main(int argc, char *argv[]) { QApplication a(argc, argv); - // MainWindow w; - // w.show(); + MainWindow w; + w.show(); // DBUnit t; diff --git a/mainwindow.cpp b/mainwindow.cpp index 246458d..c63bba4 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -5,11 +5,14 @@ #include #include -#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().pixmap(QSize(100, 150)); auto cover1 = index.data(GROUP_COVER1); if (cover1.isNull()) cover1 = default_cover->pixmap(QSize(100, 150)); + else + cover0 = cover0.value().pixmap(QSize(100, 150)); auto cover2 = index.data(GROUP_COVER2); if (cover2.isNull()) cover2 = default_cover->pixmap(QSize(100, 150)); + else + cover0 = cover0.value().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().pixmap(QSize(100, 150)); + + painter->drawPixmap(valid_rect, cover.value()); +} + +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(editor)->setText(index.data().toString()); +} + +void +ListIconDelegate::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const +{ + model->setData(index, static_cast(editor)->text()); +} + +void +ListIconDelegate::updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const +{ + editor->setGeometry(option.rect); +} diff --git a/mainwindow.h b/mainwindow.h index 43a4061..d06f093 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -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