Qt文档阅读笔记-QStyledItemDelegate::paint介绍及简单使用

583 篇文章 127 订阅
196 篇文章 13 订阅

官方解析

重写于QAbstractItemDelegate::paint()。

通过使用option与painter对指定的index位置的委托进行渲染。

当描述各种item的时候使用view的QStyle。

当从子类重新实现paint这个函数时候,要用initStyleOption()这个函数去重新设置option这个参数。

在画图中要尽可能的使用option参数,特别是这个参数里的rect变量。并且option里面的state这个变量也非常好用,他能判断这个item是否enabled或selected。

当画玩后,painter要会到调用他之前的状态。举个栗子,在调用前使用QPainter::save()在调用后使用QPainter::restore()。


博主小栗子

同样还是使用了三只小猪的例子(源码链接如下,在此只给出伪代码)

原始伪代码(很辣鸡的代码,根本就是乱搞):

void MyDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QStyledItemDelegate::paint(painter, option, index);


    if(index.data().canConvert<MyPic>()){
        //qDebug()<<"can be convert!";
        MyPic mypic=qvariant_cast<MyPic>(index.data());
        mypic.paint(painter,option.rect);
    }
    else{
        qDebug()<<"can't be convert!";
    }
}
void MyPic::paint(QPainter *painter,const QRect &rect) const
{
    painter->setRenderHint(QPainter::Antialiasing, true);
    for(int i=0;i<m_num;i++){
        painter->drawImage(rect.x()+i*m_singlePicWidth,rect.y(),QImage(":/img/pig.png").scaled(m_singlePicWidth,m_singlePicWidth));
    }
}

运行截图如下:

修改后的伪代码:

void MyDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QStyledItemDelegate::paint(painter, option, index);


    if(index.data().canConvert<MyPic>()){
        //qDebug()<<"can be convert!";
        MyPic mypic=qvariant_cast<MyPic>(index.data());

        if(option.state&QStyle::State_Selected){

            painter->save();
            painter->fillRect(option.rect,Qt::DiagCrossPattern);
            painter->restore();
        }

        mypic.paint(painter,option.rect);
    }
    else{
        qDebug()<<"can't be convert!";
    }
}
void MyPic::paint(QPainter *painter,const QRect &rect) const
{
    painter->save();

    painter->setRenderHint(QPainter::Antialiasing, true);
    for(int i=0;i<m_num;i++){
        painter->drawImage(rect.x()+i*m_singlePicWidth,rect.y(),QImage(":/img/pig.png").scaled(m_singlePicWidth,m_singlePicWidth));
    }

    painter->restore();
}

运行截图如下:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT1995

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值