围绕圆而不是点旋转 QGraphicsLineItems

问题描述 投票:0回答:1

因此,我有一个带有两个图形圆圈和一个自定义订单项的场景。我创建了两个行项目,其中传入布尔值“foo”来确定如何分隔行,因为我希望圆圈通过 || 等两条线连接。

当我围绕源移动目标圆时,我希望这些线保持相同的距离,但现在当它们接近 y=x 并在那条线上翻转时,它们会彼此靠近。

我尝试实现一个自定义调整函数,该函数在行项目的 init 中被调用:

def adjust(self, foo: bool):
   self.prepareGeometryChange()
   adjust = 4
   if not foo:
       adjust *= -1
   self.setLine(
      QtCore.QLineF(
           self.source.pos().x()+adjust,
           self.source.pos().y()+adjust,
           self.dest.pos().x()+adjust,
           self.dest.pos().y()+adjust,
       )
    )

我该怎么做才能让它们绕着圆圈而不是绕着一个点旋转?

python user-interface pyqt5 qgraphicsscene qgraphicslineitem
1个回答
0
投票

几个月后我终于回到了这个问题并给出了答案:

def adjust(self, foo: bool):
   self.prepareGeometryChange()

   delta = QtCore.QPointF(self.source.pos() - self.dest.pos())
   length = delta.manhattanLength()
   if length == 0.0:
      return self.setLine(
         QtCore.QLineF(
              self.source.pos(),
              self.dest.pos()
        )
     )

   direction = QtCore.QPointF(delta.x()/length, delta.y()/length)
   perpendicular = QtCore.QPointF(-direction.y(), direction.x())
   line_offset = 5

   sign = -1 if foo else 1

   x_adjust = (sign*perpendicular.x()) * (sign*line_offset)
   y_adjust = (sign*perpendicular.y()) * (sign*line_offset)

   self.setLine(
      QtCore.QLineF(
           self.source.pos().x()-x_adjust,
           self.source.pos().y()-y_adjust,
           self.dest.pos().x()-x_adjust,
           self.dest.pos().y()-y_adjust,
       )
    )
© www.soinside.com 2019 - 2024. All rights reserved.