You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt中如何绘制两点间过指定点圆弧并消除路径多余竖线

目标绘制效果示意图
需求为在B、D两点间绘制过E点的圆弧,完成AND与门逻辑符号。
最初实现代码如下:

QPainterPath path;    
path.arcTo(60,30,46,100,30*16,120*16); // ( x,y,width,height, startAngle,spanAngle)       

运行后绘制图形接近整圆、位置偏移,实际效果如下:
错误绘制效果截图
调整参数后代码改为:

path.moveTo(106, 80);
path.arcTo(76.0, 30.0, 60.0, 100.0, 90.0, -180.0);    

此时与门内部出现多余竖线,以下是原因和解决方案:

竖线产生原因

QPainterPath的绘制逻辑是连续的:调用arcTo时,不会自动断开当前路径跳转到圆弧起点,而是会先从路径当前停留的最后一个点,画一条直线连接到圆弧的实际起始点,再开始绘制圆弧段。
你代码中先调用moveTo(106, 80)把路径起点放在了外接椭圆的圆心位置,但你传入的圆弧参数对应的实际起点是(106, 30)(外接矩形x=76、y=30、w=60、h=100,对应椭圆中心为(106,80),起始角度90度对应椭圆最上方点(106,30)),所以路径自动从圆心向上画了一条竖直线到圆弧起点,这就是多余竖线的来源。

另外补充第一次代码出错的原因:整数参数版本的arcTo角度单位是1/16度,你角度参数的写法是对的,但外接矩形的x、y、width参数设置错误,导致椭圆位置、大小不符合预期,最终画出的圆弧接近整圆、位置偏移。注意浮点数版本的arcTo角度单位是直接的度数,不需要乘16,两个重载不要混用参数规则。

消除竖线的方法

只需要把moveTo的目标点改成圆弧的实际起始点即可,修改后代码如下:

QPainterPath path;
path.moveTo(106, 30); // 移动到圆弧的真实起始点,而非圆心
path.arcTo(76.0, 30.0, 60.0, 100.0, 90.0, -180.0);

如果你已经在这段代码之前绘制了与门的上边框,路径已经停在B点(106,30),连moveTo都不需要写,直接调用arcTo就可以连续绘制,不会产生多余线条。

内容的提问来源于stack exchange,提问作者tushar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 11:42:17