PyQt新手,我在旋转QGraphicsEllipseItem时遇到问题。我希望椭圆围绕椭圆的中心旋转,而不是用于定义椭圆的QRectF的角。我的代码看起来像这样(对不起,我正在编写的计算机,没有互联网访问权限,所以我手动复制相关部分):
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)
好的,这基本上就是我的预期。由于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做了错误的假设。有些网站暗示我可能需要使用边界矩形来进行旋转,但我不明白该怎么做。
如果有人能告诉我在pyqt中围绕其中心旋转椭圆的正确方法,我将非常感谢!!!
答案 0 :(得分: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 :(得分: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_()
注意我计算椭圆中心的方式。