前两篇内容说的都是Qt在表格进行编辑操作,我们可以在表格中加入不同的控件来帮助我们完成编辑操作。不过有时候我们需要在表格中加入一些无需交互的控件,例如放一个进度条表示下载的进度,在表格中放一张图片表示不同的状态等等。那我们该怎么做呢?
我们可以使用上一篇中的delegate来帮助我们实现这样的目的,只需要重写它的paint函数就可以了。
virtual void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
以进度条为例(随便选择一个列进行绘制):
if(index.column() == 2){ //绘制进度条
QStyleOptionProgressBarV2* progressOpt = new QStyleOptionProgressBarV2();
progressOpt->rect = option.rect.adjusted(5,5,-5,-5);
progressOpt->minimum = 0;
progressOpt->maximum = 100;
progressOpt->progress = 66; //设置固定的值
progressOpt->text = "66%";
progressOpt->textVisible = true;
progressOpt->textAlignment = Qt::AlignCenter;
QApplication::style()->drawControl(QStyle::CE_ProgressBar,progressOpt,painter);
}
重写paint函数,在其中调用drawControl()函数绘制控件,其中QStyleOptionProgressBarV2描述了进度条控件绘制的属性。例子中使用了固定的值,实际应用中可以根据model中的值进行设置。效果如下:
要绘制图片就更简单了直接看代码:
}else if(index.column() == 0){
QPixmap pixmap("f:/05_test/icon.png");
QApplication::style()->drawItemPixmap(painter,option.rect,Qt::AlignCenter,pixmap);
}
仔细观察paint的参数,我们可以发现有painter还有option。既然拿到了painter又知道了Item的区域了,那不是想画什么就画什么吗?只要你脑洞够大。可惜我脑洞不够大,那就画个圆意思意思吧:
}else if(index.column() == 0){
// QPixmap pixmap("f:/05_test/icon.png");
// QApplication::style()->drawItemPixmap(painter,option.rect,Qt::AlignCenter,pixmap);
painter->setRenderHint(QPainter::Antialiasing);
painter->setPen(Qt::NoPen);
if(index.row()%2){
painter->setBrush(Qt::green);
}else{
painter->setBrush(Qt::red);
}
QPoint ct = option.rect.center();
QRect rc = QRect(ct.x() - 5,ct.y() - 5,10,10);//居中,半径为5.
painter->drawEllipse(rc);
}