查看完整版本: [-- 如何优化一个QStyledItemDelegate继承类的paint方法 --]

QTCN开发网 -> Qt基础编程 -> 如何优化一个QStyledItemDelegate继承类的paint方法 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

alexltr 2020-04-20 12:36

如何优化一个QStyledItemDelegate继承类的paint方法

我有一个model, 其中有一栏数据存储表示图片文件名的字符串,如“1.png;4.png;5.png
现在我想通过用QStyledItemDelegate继承类来将这些图片在TableView中显示出来,主要的代码如下。
但有两个问题请教一下各位:
1. 速度比较慢,请问在代码上是否可以优化?或者这种需求是否有其它更好的解决办法?
2. 怎样更加有效的取得sizeHint?
谢谢!

multiimagesdelegate.h   


  1. #ifndef MULTIIMAGESDELEGATE_H
    #define MULTIIMAGESDELEGATE_H

    #include <QStyledItemDelegate>
    #include <QString>
    #include <QObject>
    #include <QPainter>
    #include <QModelIndex>
    #include <QStyle>
    #include <QStringList>
    #include <QPixmap>
    #include <QImage>
    #include <QRect>
    #include <QSize>
    #include <QFile>

    class MultiImagesDelegate : public QStyledItemDelegate
    {
        Q_OBJECT

    public:
        MultiImagesDelegate(QObject *parent = 0);
        MultiImagesDelegate(const QString &imagesFolder, QObject *parent = 0);

        void setImagesFolder(const QString &imagesFolder);

        void paint(QPainter *painter, const QStyleOptionViewItem &option,
                   const QModelIndex &index) const override;

        QSize sizeHint(const QStyleOptionViewItem &option,
                       const QModelIndex &index) const override;

    private:
         QString mImagesFolder;
         mutable int mWidthHint;
         enum {ImageMargin = 1};
    };

    #endif


multiimagesdelegate.cpp  


  1. #include "multiimagesdelegate.h"

    MultiImagesDelegate::MultiImagesDelegate(QObject *parent) :
        QStyledItemDelegate(parent)
    {
        mWidthHint = 200;
    }

    MultiImagesDelegate::MultiImagesDelegate(const QString &imagesFolder, QObject *parent) :
        QStyledItemDelegate(parent)
    {
        setImagesFolder(imagesFolder);
    }

    //设置图片所在的文件夹
    void MultiImagesDelegate::setImagesFolder(const QString &imagesFolder)
    {
        mImagesFolder = imagesFolder;
    }

    void MultiImagesDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                             const QModelIndex &index) const
    {  
        //painter->save();
        painter->setRenderHint(QPainter::Antialiasing);
        //如果是用户选择的行,则用高亮色绘制背景
        if (option.state & QStyle::State_Selected)
            painter->fillRect(option.rect, option.palette.highlight());

        //把model里的图片文件字符串拆分为一个QStringList
        QStringList images = index.data().toString().split(";");
        //绘制每张图片的x位移量,初始值从0开始
        int xOffsetForAdjust = 0;

        QRect optionRect = option.rect;

        //遍历图片文件名,并绘制图片
        for (int i = 0; i < images.count(); ++i) {

            QString imageFileName(mImagesFolder + images.at(i));
            if (QFile(imageFileName).exists()) {
                //加载图片
                QImage individualImage = QImage(imageFileName);
                //按行高对图片进行尺寸调整
                QImage scaledIndividualImage = individualImage.scaledToHeight(optionRect.height());

                //调整后的实际图片宽度和高度
                int scaledWidthOfImage = scaledIndividualImage.width();
                int scaledHeightOfImage = scaledIndividualImage.height();

                //定义绘制图片的矩形
                QRect imageRect(optionRect);
                imageRect.setWidth(scaledWidthOfImage);
                imageRect.setHeight(scaledHeightOfImage);

                //按照已经绘制的图片大小以及当前图片的大小调整当前图片绘制矩形的位置
                imageRect.adjust(xOffsetForAdjust + ImageMargin, ImageMargin * 2,
                                 xOffsetForAdjust - ImageMargin, -ImageMargin * 2);
                //把当前图片的宽度加到总的x位移量,用于下一张图片的绘制
                xOffsetForAdjust += scaledWidthOfImage;

                //绘制当前图片
                painter->drawImage(imageRect, scaledIndividualImage);

                //计算所有已经绘制的图片的宽度, 用于sizHint
                int totalWidth = imageRect.right() - optionRect.left() + ImageMargin * 2;
                if (totalWidth > mWidthHint)  //?? 当尺寸变小后,此方法不适用
                    mWidthHint = totalWidth;
            }
        }
        //painter->restore();
    }

    QSize MultiImagesDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
    {
        Q_UNUSED(option);
        Q_UNUSED(index);
        return QSize(mWidthHint,100);
    }





fu22507411 2020-04-20 13:08
给图片做缓存

alexltr 2020-04-20 13:25
fu22507411:给图片做缓存 (2020-04-20 13:08) 

谢谢回复。

能麻烦你稍微再具体一点吗?

dinjay 2020-04-20 15:21
model是重写的吧,data函数自义定一个类型,然后return value的时候直接返回qimage对象,delegate里就index()->data()取到的就是qimage对象了,一般托管里不做复杂耗时的数据读写处理。

alexltr 2020-04-20 15:56
dinjay:
model是重写的吧,data函数自义定一个类型,然后return value的时候直接返回qimage对象,delegate里就index()->data()取到的就是qimage对象了,一般托管里不做复杂耗时的数据读写处理。

是的。 这个我尝试一下。谢谢。


查看完整版本: [-- 如何优化一个QStyledItemDelegate继承类的paint方法 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled