微信消息框如下:
使用QGraphicsItem绘制,怎么绘制呢?
先不考虑头像,那文本框就是由一个菱形矩形加一个小箭头组成的。所以很简单就能画出来了。
void PopoItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
Q_UNUSED(widget);
const double radius = 10.0;
const double flag_radius = 5.0;
QPainterPath path;
QPainterPath roundRectPath;
roundRectPath.moveTo(option->rect.width(), 0.0);
roundRectPath.arcTo(option->rect.width() - radius, 0, radius, radius, 0.0, 90.0);
roundRectPath.lineTo(radius / 2, 0);
roundRectPath.arcTo(0, 0, radius, radius, 90.0, 90.0);
roundRectPath.lineTo(0, option->rect.height());
roundRectPath.arcTo(0, option->rect.height() - radius, radius, radius, 180.0, 90.0);
roundRectPath.lineTo(option->rect.width() - radius / 2, option->rect.height());
roundRectPath.arcTo(option->rect.width() - radius, option->rect.height() - radius, radius, radius, 270.0, 90.0);
roundRectPath.closeSubpath();
path.addPath(roundRectPath);
if (!m_toLeft) {
QPainterPath flagPath;
flagPath.moveTo(option->rect.width(), option->rect.height() / 2.0 + flag_radius);
flagPath.lineTo(option->rect.width() + flag_radius, option->rect.height() / 2.0);
flagPath.lineTo(option->rect.width(), option->rect.height() / 2.0 - flag_radius);
flagPath.closeSubpath();
path.addPath(flagPath);
} else {
QPainterPath flagPath;
flagPath.moveTo(0.0, option->rect.height() / 2.0 + flag_radius);
flagPath.lineTo(-flag_radius, option->rect.height() / 2.0);
flagPath.lineTo(0.0, option->rect.height() / 2.0 - flag_radius);
flagPath.closeSubpath();
path.addPath(flagPath);
}
painter->save();
painter->setBrush(m_brushColor);
painter->fillPath(path, m_brushColor);
painter->restore();
}