QPainter绘图效果不错。画个宝马车标练练手。
话不多说,先上效果图
核心代码
绘制背景圆形:
void MyBMW::drawOuterCircle(QPainter* painter)
{
painter->save();
// 抗锯齿
painter->setRenderHint(QPainter::Antialiasing);
// 设置画笔(无画笔)
painter->setPen(Qt::NoPen);
// 设置画刷(黑色)
painter->setBrush(QBrush(Qt::black));
// 半径
m_outerCircleRadius = width() > height() ?
height()/2 : width()/2;
QPointF top_left(rect().center().x() - m_outerCircleRadius,
rect().center().y() - m_outerCircleRadius);
QPointF bottom_right(rect().center().x() + m_outerCircleRadius,
rect().center().y() + m_outerCircleRadius);
// 画圆
painter->drawEllipse(QRectF(top_left, bottom_right));
painter->restore();
}
效果图:
绘制内圆:
void MyBMW::drawInnerCircle(QPainter* painter)
{
painter->save();
// 抗锯齿
painter.setRenderHints(QPainter::Antialiasing);
// 设置画笔(无画笔)
painter->setPen(Qt::NoPen);
// 转换坐标到当前窗口中心
painter->translate(rect().center());
painter->rotate(m_angle); //m_angle=0;
// 内圆半径
int innerRadius = m_outerCircleRadius * 0.7;
QRectF tRect(QPointF(-innerRadius, -innerRadius ),
QPointF(innerRadius, innerRadius ));
int dAngle = 90 * 16;
int startAngle = 0;
for (int i = 0; i < 4; i++) {
if (i % 2) {
painter->setBrush(QBrush(Qt::blue));
} else {
painter->setBrush(QBrush(Qt::white));
}
// 画扇形
painter->drawPie(tRect, startAngle, dAngle);
startAngle += dAngle;
}
painter->restore();
}
效果图:
绘制“BMW”:
void MyBMW::drawBMW(QPainter *painter)
{
painter->save();
// 抗锯齿
painter->setRenderHint(QPainter::Antialiasing);
// 设置画笔
painter->setPen(Qt::white);
// 设置字体
QFont font;
font.setFamily("微软雅黑");
font.setPointSize(m_outerCircleRadius * 0.17); // 使文字能按照窗口大小变化而变化,0.17是一点一点试出来的。
font.setBold(true);
painter->setFont(font);
// 设置画刷(白色)
painter->setBrush(QBrush(Qt::white));
// 转换坐标系,原点为当前窗口中心
painter->translate(rect().center());
// B
painter->rotate(-45);
// 0.78也是一点点试出来的,0.11=(1-0.78)/2 ;)
QPointF bPot(-m_outerCircleRadius * 0.11, -m_outerCircleRadius * 0.78);
painter->drawText(bPot, QStringLiteral("B"));
// M
painter->rotate(45);
QPointF mPot(-m_outerCircleRadius * 0.11, -m_outerCircleRadius * 0.78);
painter->drawText(mPot, QStringLiteral("M"));
// W
painter->rotate(45);
QPointF wPot(-m_outerCircleRadius * 0.11, -m_outerCircleRadius * 0.78);
painter->drawText(wPot, QStringLiteral("W"));
painter->restore();
}
效果图:
大功告成!!!