使用QGraphicsItem绘制微信消息文本框

微信消息框如下:
微信消息框
使用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();
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值