1

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。前もって感謝します。

4

2 に答える 2

2

私は自分の質問に対する答えを見つけました。回転する前は、midpointxとmidpointyはシーン座標にあります。そのため、それらをQGraphicsItem座標系にマップし直す必要がありました。self.setRotation()の前のこの行でうまくいきます。

self.polyf.setTransformOriginPoint(self.polyf.mapFromScene(QtCore.QPointF(midpointx , midpointy)))

これで、ポリゴンがランダムに移動しなくなりました。

于 2013-01-31T19:25:49.163 に答える
1

私は PyQt にあまり詳しくありませんが、回転するとき、ほとんどの API は点 ( 0,0 ) を中心に回転するため、正しい動作は次のとおりです。 1 - ポリゴンを 0,0 に変換 2 - ポリゴンを回転 3 - ポリゴンを変換戻る

これが役立つことを願って、

よろしく。

于 2013-01-31T12:16:31.520 に答える