Qt中创建QPainterPath/QGraphicsPathItem后如何移动路径内的点?
嘿,刚好处理过类似的需求,给你一步步说清楚怎么操作:
修改QGraphicsPathItem路径点的方法
首先得明确:QPainterPath本身是不能直接修改内部已有路径点的,所以我们得先把路径里的元素提取出来,修改后重新构建路径,再设置回QGraphicsPathItem。
1. 先搞清楚路径里的元素顺序
你创建的矩形路径,内部元素的顺序是固定的:
- 索引0:
moveTo(0,0)→ 矩形的左上起点 - 索引1:
lineTo(10,0)→ 你要修改的右上点 - 索引2:
lineTo(10,10)→ 你要修改的右下点 - 索引3:
lineTo(0,10)→ 左下点 - 索引4:
closeSubpath()→ 闭合路径(这个不用管)
你可以用path.elementCount()查看总元素数,用path.elementAt(index)获取对应位置的QPainterPath.Element对象,它包含x、y坐标和元素类型。
2. 手动修改指定点并重构路径
如果是自定义的不规则路径,就用这种方法,代码示例如下:
# 先获取item当前的路径 current_path = line.path() # 提取并修改右上点(索引1) top_right_elem = current_path.elementAt(1) top_right_elem.x = 20 # 把x从10改成20,实现加宽 # 提取并修改右下点(索引2) bottom_right_elem = current_path.elementAt(2) bottom_right_elem.x = 20 # 重新构建新路径 new_path = QtGui.QPainterPath() for i in range(current_path.elementCount()): elem = current_path.elementAt(i) if i == 1: # 替换成修改后的右上点 new_path.lineTo(top_right_elem.x, top_right_elem.y) elif i == 2: # 替换成修改后的右下点 new_path.lineTo(bottom_right_elem.x, bottom_right_elem.y) else: # 其他元素按原类型添加 if elem.type == QtGui.QPainterPath.MoveToElement: new_path.moveTo(elem.x, elem.y) elif elem.type == QtGui.QPainterPath.LineToElement: new_path.lineTo(elem.x, elem.y) elif elem.type == QtGui.QPainterPath.CloseSubpathElement: new_path.closeSubpath() # 把新路径设置回QGraphicsPathItem line.setPath(new_path)
3. 针对矩形的简化技巧
如果你的路径就是规则矩形,完全不用这么麻烦,直接操作边界矩形更高效:
# 获取当前路径的边界矩形 rect = line.path().boundingRect() # 直接设置新的宽度,比如改成20 rect.setWidth(20) # 用新矩形重新创建路径 new_path = QtGui.QPainterPath() new_path.addRect(rect) # 更新item的路径 line.setPath(new_path)
这个方法简洁又不容易出错,适合矩形这种规则形状。
小提醒
- 虽然
QPainterPath.Element的x、y可以修改,但原路径不会自动更新,必须重新构建路径并设置回item才会生效。 - 如果是复杂路径,一定要注意元素的类型和顺序,避免漏加闭合路径或者错改点的位置。
内容的提问来源于stack exchange,提问作者Spencer
相关产品推荐
相关产品推荐

