1、在画出底图的圆以及上层的圆弧后,在上层再画一个透明的圆,相当于遮罩,结果就是一个圆环了:
void RingsProgressbar::paintEvent(QPaintEvent *)
{
QPainter p(this);
p.setRenderHint(QPainter::Antialiasing);
int m_persent = 35;//绘制的环的比例
int m_rotateAngle = 360*m_persent/100;
int side = qMin(width(), height());
QRectF outRect(0, 0, side, side);//矩形长宽为窗口的长宽
QRectF inRect(20, 20, side-40, side-40);
QString valueStr = QString("%1%").arg(QString::number(m_persent));
//画外圆
p.setPen(Qt::NoPen);
p.setBrush(QBrush(QColor(97, 117, 118)));
p.drawEllipse(outRect);
//画内圆
p.setBrush(QBrush(QColor(255, 107, 107)));
p.drawPie(outRect, (90-m_rotateAngle)*16, m_rotateAngle*16);
//画遮罩,遮罩颜色为窗口颜色
p.setBrush(palette().window().color());
p.drawEllipse(inRect);
//画文字
QFont f = QFont("Microsoft YaHei", 15, QFont::Bold);
p.setFont(f);
p.setFont(f);
p.setPen(QColor("#555555"));
p.drawText(inRect, Qt::AlignCenter, valueStr);
}
效果如下:
2、贴图圆环进度条
drawPie()设置笔刷后可以直接画圆弧图片:
void RingsMapProgressbar::paintEvent(QPaintEvent *)
{
QPainter p(this);
p.setRenderHint(QPainter::Antialiasing);
int m_persent = 90;
int m_rotateAngle = 360*m_persent/100;
int side = qMin(width(), height());
QRectF outRect(0, 0, side, side);
QRectF inRect(20, 20, side-40, side-40);
QString valueStr = QString("%1%").arg(QString::number(m_persent));
//画底圆
p.setPen(Qt::NoPen);
QPixmap backMap = QPixmap(":/resource/progress_back.png");
p.drawPixmap(outRect, backMap, outRect);
//画内弧
QPixmap frontMap = QPixmap(":/resource/progress_front.png");
p.setBrush(QBrush(frontMap));
p.drawPie(outRect, (90-m_rotateAngle)*16, m_rotateAngle*16);
//画文字
QFont f = QFont("Microsoft YaHei", 15, QFont::Bold);
p.setFont(f);
p.setPen(QColor("#DDDDDD"));
p.drawText(inRect, Qt::AlignCenter, valueStr);
}
效果如下: