PyQtを使用して小さなUIを構築しようとしていました。
QGraphicsViewには、ウィンドウ、ボタン(回転)、およびポリゴン(長方形)があります。このアプリの目的の1つは、ユーザーがポリゴンを回転できるようにすることです。つまり、ボタンがクリックされ、ユーザーがポイントをクリックした後、最も近い頂点がユーザーのクリックに向かって自動的にシフトまたは傾斜します。また、クリック前にポリゴンを移動可能にし、クリック後に移動できないようにポリゴンを設定しました。
問題は、ユーザーがポリゴンを移動してからクリックすると、ポリゴンが奇妙な方法で回転することです。誰かが私がエラーを理解するのを手伝ってもらえますか?私の推測では、それはsetTransformOriginPointを使用している可能性があります。
編集:QtGui.QWidgetとQtGui.QGraphicsSceneから継承された2つのクラスがあります。
class Window(QtGui.QWidget):
def polychange(self , sender): //Called by the button ,
if sender:
self.view.polyrotate = 1 //self.view is an instance of QGraphicsScene class
self.view.polyf.setFlag(QtGui.QGraphicsItem.ItemIsMovable , False)
else:
self.view.polyrotate = 0
self.view.degrees = 0
self.view.polyf.setFlag(QtGui.QGraphicsItem.ItemIsMovable)
class Example(QtGui.QGraphicsView):
def mousePressEvent(self , e):
super(Example , self).mousePressEvent(e)
self.x = e.x()
self.y = e.y()
if self.polyrotate == 1:
self.Rotate()
def Rotate(self):
self.pverticesx = []
self.pverticesy = []
distances = []
for i in range(4):
self.pverticesx.append(self.polyf.mapToScene(self.polyf.polygon()[i]).x())
self.pverticesy.append(self.polyf.mapToScene(self.polyf.polygon()[i]).y())
x1 = self.x
y1 = self.y
for i in range(4):
distance = math.hypot(self.pverticesx[i] - x1 , self.pverticesy[i] - y1)
distances.append(distance)
midpointx = (self.pverticesx[0] + self.pverticesx[2]) / 2
midpointy = (self.pverticesy[0] + self.pverticesy[2]) / 2
index = distances.index(min(distances))
pointx = self.pverticesx[index]
pointy = self.pverticesy[index]
vector1 = [x1 - midpointx , y1 - midpointy]
vector2 = [pointx - midpointx , pointy - midpointy]
num = 0
for i in [0 , 1]:
num = num + (vector1[i] * vector2[i])
den = math.sqrt(sum(map(lambda x : x * x , vector1))) * math.sqrt(sum(map(lambda x : x * x , vector2)))
degree = math.degrees(math.acos(num / den))
self.degrees = degree + self.degrees
if self.degrees > 360:
rotation = self.degrees / 360
self.degrees = self.degrees - (rotation * 360)
self.polyf.setTransformOriginPoint(midpointx , midpointy)
self.polyf.setRotation(self.degrees)
これが私のコードへのより網羅的なリンクです。RotateApp。前もって感謝します。