官方解析
重写于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();
}
运行截图如下: