首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rotate - TransformOriginPoint - PyQt4

Rotate - TransformOriginPoint - PyQt4
EN

Stack Overflow用户
提问于 2013-01-30 22:18:39
回答 2查看 1.8K关注 0票数 1

我试着用PyQt构建一个小的UI。

它在QGraphicsView中有一个窗口、一个按钮(旋转)和一个多边形(矩形)。该应用程序的一个目标是允许用户旋转多边形。也就是说,在按钮被单击且用户在某一点上单击之后,最近的顶点会自动向用户单击的方向移动或倾斜。我还将多边形设置为单击前可移动,单击后不可移动。

问题是,如果用户移动多边形,然后单击,多边形会以一种奇怪的方式旋转。有没有人能帮我找出错误?我的猜测是,它可能与setTransformOriginPoint。

编辑:我有两个继承自QtGui.QWidget和QtGui.QGraphicsScene的类。

代码语言:javascript
复制
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。提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-01 03:25:49

我已经找到了我自己问题的答案。在旋转之前,中点和中点位于场景坐标中。所以我不得不把它们映射回QGraphicsItem坐标系统。self.setRotation()之前的这一行就可以做到这一点。

代码语言:javascript
复制
self.polyf.setTransformOriginPoint(self.polyf.mapFromScene(QtCore.QPointF(midpointx , midpointy)))

现在我的多边形不会随机移动了。

票数 2
EN

Stack Overflow用户

发布于 2013-01-31 20:16:32

我对PyQt不是很熟悉,但是当旋转时,大多数API都是围绕( 0,0 )点旋转,所以正确的行为是:1-将多边形转换为0,0 2-旋转多边形3-重新转换多边形

希望这能帮上忙,

致以问候。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14606192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档