Qt 画带箭头的直线

#include <QPainter>
#include <math.h>

void DrawLineWithArrow(QPainter& painter, QPen pen, QPoint start, QPoint end)
{
    painter.setRenderHint(QPainter::Antialiasing, true);

    qreal arrowSize = 20;
    painter.setPen(pen);
    painter.setBrush(pen.color());

    QLineF line(end, start);

    double angle = std::atan2(-line.dy(), line.dx());
    QPointF arrowP1 = line.p1() + QPointF(sin(angle + M_PI / 3) * arrowSize,
                                          cos(angle + M_PI / 3) * arrowSize);
    QPointF arrowP2 = line.p1() + QPointF(sin(angle + M_PI - M_PI / 3) * arrowSize,
                                          cos(angle + M_PI - M_PI / 3) * arrowSize);

    QPolygonF arrowHead;
    arrowHead.clear();
    arrowHead << line.p1() << arrowP1 << arrowP2;
    painter.drawLine(line);
    painter.drawPolygon(arrowHead);
}

测试:

void MyWidget::paintEvent(QPaintEvent *)
{
    QPainter paint(this);
    QPen Pen = QPen(QColor(18, 157, 221), 2, Qt::SolidLine);
    DrawLineWithArrow(paint, Pen, QPoint(0, 0), QPoint(300, 300));
}

结果:

 

Qt中,你可以使用QPainter类以及相关的形状绘制功能来创建箭头图形。QPainter提供了一种灵活的方式来绘制各种形状,包括简单的直线、弧线和自定义路径,可以组合成箭头。这里是一个基本步骤: 1. 创建一个QGraphicsScene或者QWidget作为画布。 2. 获取QPainter实例,关联到这个画布。 3. 使用`drawLine()`或`drawPolygon()`等函数绘制基础线条,然后通过`save()`和`restore()`保存并恢复当前的绘图状态,添旋转和平移操作来形成箭头。 4. 示例代码: ```cpp void drawArrow(QPainter &painter, QPointF start, QPointF end, int width) { painter.save(); // 箭头头部 painter.drawLine(start.x(), start.y(), end.x(), end.y()); QPointF tailPos = end + QVector2D(end.x() - start.x(), -(end.y() - start.y())); painter.drawLine(end, tailPos); // 上下左右箭头方向 if (width > 0) { // 右侧箭头 painter.drawPolygon(QPolygonF({QPointF(end.x() + width, end.y()), QPointF(end.x() + width * 0.7, end.y() - width), QPointF(end.x() + width * 0.3, end.y() - width)})); // 左侧箭头 painter.drawPolygon(QPolygonF({QPointF(end.x() - width, end.y()), QPointF(end.x() - width * 0.7, end.y() - width), QPointF(end.x() - width * 0.3, end.y() - width)})); // 下部箭头 QPointF downPos = end + QVector2D(0, -width); painter.drawPolygon(QPolygonF({QPointF(end.x(), downPos.y()), QPointF(end.x() - width * 0.5, downPos.y() + width), QPointF(end.x() + width * 0.5, downPos.y() + width)})); // 上部箭头 QPointF upPos = end + QVector2D(0, width); painter.drawPolygon(QPolygonF({QPointF(end.x(), upPos.y()), QPointF(end.x() - width * 0.5, upPos.y() - width), QPointF(end.x() + width * 0.5, upPos.y() - width)})); } painter.restore(); } // 使用示例 QPainter painter(canvas); QRectF rect = QRectF(start, QSize(width * 2, height * 2)); painter.setRenderHint(QPainter::Antialiasing); // 为了平滑效果 painter.drawRoundedRect(rect, 5, 5); // 可选地添圆角 drawArrow(painter, rect.topLeft(), rect.bottomRight(), width); ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值