2014-01-06 53 views
1

新的PyQt和我有问题旋转QGraphicsEllipseItem。我希望椭圆围绕椭圆的中心旋转,而不是用于定义椭圆的QRectF的拐角。我的代码看起来像这样(对不起,我编码它的电脑,没有上网,所以我的手在这里复制的相关部分):PyQt QGraphicsEllipseItem旋转偏移

self.scene = QtGui.QGraphicsScene() 
self.ui.graphicsView.setScene(self.scene) 
pen = QtGui.QPen(QColor(Qt.yellow)) 

# Draw first Ellipse 
# This code correctly places a yellow ellipse centered at the scene 500,500 point 
ellipse1 = QtGui.QGraphicsEllipseItem(0,0,100,10) 
ellipse1.setPen(pen) 
self.scene.addItem(ellipse1) 
ellipse1.setPos(500, 500) 
ellipse1.translate(-50, -5) 

# Now, try to draw a rotated ellipse 
# This code rotates the ellipse about the 0,0 location of the rectangle 
#  which is the scene 450, 495 point, not the center of the ellipse 
ellipse2 = QtGui.QGraphicsEllipseItem(0,0,100,10) 
ellipse2.setPen(pen) 
self.scene.addItem(ellipse2) 
ellipse2.setPos(500, 500) 
ellipse2.translate(-50, -5) 
ellipse2.rotate(45.0) 

OK,这基本上是我所期待的。由于QGraphicsEllipseItem是从的QGraphicsItem衍生,我试着旋转之前设置的转换原点的则ellipse2:

ellipse2 = QtGui.QGraphicsEllipseItem(0,0,100,10) 
ellipse2.setPen(pen) 
self.scene.addItem(ellipse2) 
ellipse2.setPos(500, 500) 
ellipse2.translate(-50, -5) 
ellipse2.setTransformOriginPoint(450, 495) 
ellipse2.rotate(45.0) 

这将导致错误“AttributeError的:‘QGraphicsEllipseItem’对象有没有属性‘setTransformOriginPoint’

显然,我做错了什么或者做了一个关于QGraphicsEllipseItem的错误假设,有些网站暗示我可能需要使用边界矩形才能进行旋转,但我不知道该怎么做。

如果有人能够让我看到旋转椭圆ab的正确方法在pyqt中取出它的中心,我将不胜感激!

回答

1

好吧,所以在几周后我能找到我自己的答案,虽然我真的不明白它为什么会起作用。我用brail编程的标准方法。无论如何,代码应该看起来像这样:

transform = QtGui.QTransform() 
ellipse = QtGui.QGraphicsEllipseItem(0,0,100,10) 
ellipse.setPen(pen) 
ellipse.setPos(500, 500) 
transform.rotate(-45.0) # rotate the negative of the angle desired 
transform.translate((-50, -5) # center of the ellipse 
ellipse.setTansform(transform) 
self.scene.addItem(ellipse) 

因此,这成功地将旋转的椭圆的中心放置在点500,500。我不知道为什么你会采取你想旋转角度的负面,但它似乎工作。如果任何人都可以解释为什么它的作品,我将不胜感激。

1

我得到了同样的问题,花了整整两天的时间来解决它。
这是我的解决方案:
首先,你应该定义围绕椭圆应该旋转,这样的点的坐标(X,Y):
ellipse.setTransformOriginPoint(QPointF(?, ?))
那么你可以使用setRotation()旋转椭圆
整个代码可以看到下面:

__author__ = 'shahryar_slg' 

from PyQt4.QtGui import * 
from PyQt4.QtCore import * 


class MainWindow(QDialog): 

    def __init__(self): 
     super(QDialog, self).__init__() 

     self.view = QGraphicsView() 
     self.scene = QGraphicsScene() 
     self.layout = QGridLayout() 
     self.layout.addWidget(self.view, 0, 0) 
     self.view.setScene(self.scene) 
     self.setLayout(self.layout) 


     self.ellipse = QGraphicsEllipseItem(10, 20, 100, 60) 
     self.ellipse.setTransformOriginPoint(QPointF(100/2+10, 60/2+20)) 
     self.ellipse.setRotation(-60) 
     self.scene.addItem(self.ellipse) 

     # I created another ellipse on the same position to show you 
     # that the first one is rotated around it's center: 
     self.ellipse2 = QGraphicsEllipseItem(20, 20, 100, 40) 
     self.scene.addItem(self.ellipse2) 

     self.update() 


if __name__ == "__main__": 
    import sys 
    app = QApplication(sys.argv) 
    window = MainWindow() 
    window.show() 
    app.exec_() 

注重我已经计算出的椭圆中心的方式。