当前位置: 首页>后端>正文

Qt绘制箭头

Qt绘制箭头

接收两个点作为向量的两端,用来确定箭头方向,额外添加参数,确定箭头是否和向量一致

然后使用fillPath填充箭头


            QPainterPath arrowPath(const QPointF& p1, const QPointF& p2, int direct = 0, int endIndex = 0, int arrowSize = 10)
            {
                QPainterPath path;

                QLineF line(p1, p2);

                double angle = ::acos(line.dx() / line.length());
                if (line.dy() >= 0)
                    angle = (M_PI * 2) - angle;

                if (endIndex == 0 || endIndex == 1)
                {
                    if (direct == 0)
                    {
                        QPointF arrowP1 = p1 + QPointF(sin(angle + M_PI / 3) * arrowSize,
                            cos(angle + M_PI / 3) * arrowSize);
                        QPointF arrowP2 = p1 + QPointF(sin(angle + M_PI - M_PI / 3) * arrowSize,
                            cos(angle + M_PI - M_PI / 3) * arrowSize);

                        path.moveTo(p1);
                        path.lineTo(arrowP1);
                        path.lineTo(arrowP2);
                        path.lineTo(p1);
                    }
                    else
                    {
                        QPointF arrowP1 = p1 - QPointF(sin(angle + M_PI / 3) * arrowSize,
                            cos(angle + M_PI / 3) * arrowSize);
                        QPointF arrowP2 = p1 - QPointF(sin(angle + M_PI - M_PI / 3) * arrowSize,
                            cos(angle + M_PI - M_PI / 3) * arrowSize);
                        QPointF extendP1 = p1 - QPointF(sin(angle) * 2 * arrowSize,
                            cos(angle) * 2 * arrowSize);

                        path.moveTo(p1);
                        path.lineTo(arrowP1);
                        path.lineTo(arrowP2);
                        path.lineTo(p1);
                        path.lineTo(extendP1);
                    }
                }

                if (endIndex == 0 || endIndex == 2)
                {
                    if (direct == 0)
                    {
                        QPointF arrowP1 = p2 - QPointF(sin(angle + M_PI / 3) * arrowSize,
                            cos(angle + M_PI / 3) * arrowSize);
                        QPointF arrowP2 = p2 - QPointF(sin(angle + M_PI - M_PI / 3) * arrowSize,
                            cos(angle + M_PI - M_PI / 3) * arrowSize);

                        path.moveTo(p2);
                        path.lineTo(arrowP1);
                        path.lineTo(arrowP2);
                        path.lineTo(p2);
                    }
                    else
                    {
                        QPointF arrowP1 = p2 + QPointF(sin(angle + M_PI / 3) * arrowSize,
                            cos(angle + M_PI / 3) * arrowSize);
                        QPointF arrowP2 = p2 + QPointF(sin(angle + M_PI - M_PI / 3) * arrowSize,
                            cos(angle + M_PI - M_PI / 3) * arrowSize);
                        QPointF extendP2 = p2 + QPointF(sin(angle) * 2 * arrowSize,
                            cos(angle) * 2 * arrowSize);

                        path.moveTo(p2);
                        path.lineTo(arrowP1);
                        path.lineTo(arrowP2);
                        path.lineTo(p2);
                        path.lineTo(extendP2);
                    }
                }

                return path;
            }


https://www.xamrdz.com/backend/3j51948188.html

相关文章: