• Qt::QListView


    #ifndef MUITEIMAGEELEGATE_H
    #define MUITEIMAGEELEGATE_H
    #include <QStyledItemDelegate>
    #include <QMetaType>
    
    
    typedef struct {
        QString strIds;
        QString strImageType;
        QString strPicName;
        QString strUpdateTime;
        QString strBase64;
    } MuItemImageData;
    
    Q_DECLARE_METATYPE(MuItemImageData)
    
    class PGMultiImageDelegate : public QStyledItemDelegate
    {
        Q_OBJECT
    public:
        PGMultiImageDelegate(QObject *parent = nullptr);
    
        // painting
        void paint(QPainter *painter,
                   const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE;
    
        QSize sizeHint(const QStyleOptionViewItem &option,
                       const QModelIndex &index) const Q_DECL_OVERRIDE;
    
        bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index);
    
    signals:
        void itemClicked(int);
        
    };
    
    #endif // MUITEMDELEGATE_H
    #include "StdAfx.h"
    #include <QPainter>
    #include <QDebug>
    #include "PGMultiImageDelegate.h"
    #include <QPainter>
    
    #define  PIXMAP_SIZE    80
    
    PGMultiImageDelegate::PGMultiImageDelegate(QObject *parent) :
        QStyledItemDelegate(parent)
    {
    
    }
    
    void PGMultiImageDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
    {
        if (index.isValid()) {
            painter->save();
            QVariant var = index.data(Qt::UserRole+1);
            MuItemImageData itemData = var.value<MuItemImageData>();
    
            // item 矩形区域
            QRectF rect;
            rect.setX(option.rect.x());
            rect.setY(option.rect.y());
            rect.setWidth(option.rect.width()-1);
            rect.setHeight(option.rect.height()-1);
    
            QPainterPath path;
            path.moveTo(rect.topRight());
            path.lineTo(rect.topLeft());
            path.quadTo(rect.topLeft(), rect.topLeft());
            path.lineTo(rect.bottomLeft());
            path.quadTo(rect.bottomLeft(), rect.bottomLeft());
            path.lineTo(rect.bottomRight());
            path.quadTo(rect.bottomRight(), rect.bottomRight());
            path.lineTo(rect.topRight());
            path.quadTo(rect.topRight(), rect.topRight());
    
            // 鼠标悬停或者选中时改变背景色
            if (option.state.testFlag(QStyle::State_MouseOver)) {
                painter->setPen(QPen(QColor("#ebeced")));
                painter->setBrush(QColor("#ebeced"));
                painter->drawPath(path);
            }
            if (option.state.testFlag(QStyle::State_Selected)) {
                painter->setPen(QPen(QColor("#e3e3e5")));
                painter->setBrush(QColor("#e3e3e5"));
                painter->drawPath(path);
            }
    
            // 绘制图片
            QPixmap pixmap;
            pixmap.loadFromData(QByteArray::fromBase64(itemData.strBase64.toLocal8Bit()));
            pixmap.scaled(PIXMAP_SIZE, PIXMAP_SIZE, Qt::KeepAspectRatio);
            QRectF iconRect = QRect(rect.left(), rect.top(), PIXMAP_SIZE, PIXMAP_SIZE);
            painter->drawImage(iconRect, QImage(pixmap.toImage()));
    
            //设备名称
            QRectF rectDevName = QRect(iconRect.right()+5, iconRect.top(), rect.width()-10-iconRect.width(), 20);
            painter->setPen(QPen(Qt::black));
            painter->setFont(QFont("Microsoft Yahei", 8));
            painter->drawText(rectDevName, itemData.strImageType);
        
            QRectF rectName = QRect(rectDevName.left(), rectDevName.bottom() + 5, rect.width() - 10 - iconRect.width(), 20);
            painter->setPen(QPen(Qt::gray));
            painter->drawText(rectName, itemData.strPicName);
    
            QRectF rectUpdateTime = QRect(rectName.left(), rectName.bottom() + 5, rect.width() - 10 - iconRect.width(), 20);
            painter->setPen(QPen(Qt::gray));
            painter->drawText(rectUpdateTime, itemData.strUpdateTime);
            
            painter->restore();
        }
    }
    
    bool PGMultiImageDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
    {
        if (event->type() == QEvent::MouseButtonRelease)
        {
            emit itemClicked(index.row());
        }
        return true;// QStyledItemDelegate::editorEvent(event, model, option, index);
    }
    
    QSize PGMultiImageDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
    {
        Q_UNUSED(index)
        return QSize(option.rect.width(), PIXMAP_SIZE);
    }
    void PGMediaCardDlg::_initImageData()
    {
        if (m_ImageInfoList.count() == 0)
            return;
    
        m_pModel->clear();
        m_qImageListView->resizeMode();
        for (int i = 0; i < m_ImageInfoList.count(); ++i) {
            QStandardItem *pItem = new QStandardItem;
            MuItemImageData itemData;
            pItem->setData(QVariant::fromValue(itemData), Qt::UserRole + 1);
            m_pModel->appendRow(pItem);
        }
        PGMultiImageDelegate *pItemDelegate = new PGMultiImageDelegate(this);
        m_qImageListView->setItemDelegate(pItemDelegate);
        m_qImageListView->setModel(m_pModel);
        connect(pItemDelegate, SIGNAL(itemClicked(int)), this, SLOT(slotImageListViewItemClicked(int)));
    }
  • 相关阅读:
    [Vue] Computed property "XXX" was assigned to but it has no setter.
    vue路由传参的三种基本方式
    ECharts大屏数据可视化展板项目 适配rem
    vue-cli3.0结合lib-flexible、px2rem实现适配,完美解决第三方ui库样式变小问题
    element-ui 实现行合并-亲测有效!
    ui自动化用Tesseract类截取和识别验证码【多测师】
    史上最全软件测试工程师常见的面试题总结(一)【多测师】
    Python操作非关系型数据库Redis【多测师】
    Java当中的重载和重写的区别【多测师】
    3道经典的Python练习题【多测师】
  • 原文地址:https://www.cnblogs.com/osbreak/p/15632412.html
Copyright © 2020-2023  润新知