QTransform().rotate() 改变小部件的位置

QTransform().rotate() changes the position of the widget

我有一个带有 QGraphicsScene 的 QGraphicsView,其中添加了 QPixmap。

我想在屏幕上绘制一个矩形并将其旋转 75 度或任何其他角度。

但是,我尝试了以下代码:

from PyQt5.QtCore import QRect, Qt
from PyQt5.QtGui import QPixmap, QTransform
from PyQt5.QtWidgets import QApplication, QGraphicsScene, QGraphicsView, QMainWindow , QWidget , QLabel
import sys

def window():
    app = QApplication(sys.argv)
    
    window = QMainWindow()
    
    graphics = QGraphicsView(window)
    
    scene = QGraphicsScene()
    
    scene.addPixmap(QPixmap("new_image.png"))
    
    graphics.setScene(scene)
    
    graphics.setGeometry(QRect(0 , 0 , 1980 , 1080))
    
    graphics.setAlignment(Qt.AlignLeft | Qt.AlignTop)
    
    rect = scene.addRect(700 , 10 , 100 , 50)
    
    rect.setTransform(QTransform().rotate(75))

    window.show()
    
    sys.exit(app.exec_())
    
 
if __name__ == '__main__':
   window()

确实旋转了标签,但改变了它的位置。在评论旋转线时,它位于正确的位置。

您的代码中存在一些问题和误解。

  1. 不鼓励任意添加小部件和设置固定几何形状,因为应该使用 layout managers
  2. 不应将小部件添加到 QMainWindow 只是通过将它们作为父级添加到 QMainWindow 中,而是通过将它们设置为它们的 central widget; the central widget is installed in the internal layout manager of the QMainWindow using setCentralWidget();
  3. a QGraphicsView 根据场景内容的边界矩形自动设置 visible/scrollable scene rectangle
  4. 项目总是创建时 position0,0;使用 100, 100, 50, 50 创建的 QGraphicsRectItem 将在 0,0 添加一个 positioned 的项目,并在 100,100;[=52= 处绘制 50x50 矩形]
  5. 转换(包括旋转)始终默认为 0,0origin point
  6. setTransform应用于当前变换,不考虑变换原点;如果要旋转项目,请使用 setRotation();

考虑到上述情况,如果您想要一个矩形 placed at 700,10 并围绕其原点旋转 75 度,您应该添加一个 QGraphicsRectItem,其坐标为 0, 0, 100, 50 移动 700,10。请注意,如前所述,变换原点始终位于 0,0setTransform 会忽略这一点,因此如果您想围绕其中心旋转它,您也应该设置该点:

    rect = scene.addRect(0, 0, 100, 50)
    rect.setPos(700, 10)
    rect.setTransformOriginPoint(rect.boundingRect().center())
    rect.setRotation(75)

这是对您的代码的正确更正,包括上面解释的所有方面:

def window():
    app = QApplication(sys.argv)
    window = QMainWindow()
    graphics = QGraphicsView()
    window.setCentralWidget(graphics)
    scene = QGraphicsScene()
    scene.addPixmap(QPixmap("new_image.png"))
    graphics.setScene(scene)
    graphics.setSceneRect(QRectF(0 , 0 , 1980 , 1080))
    graphics.setAlignment(Qt.AlignLeft | Qt.AlignTop)
    rect = scene.addRect(0, 0, 100, 50)
    rect.setPos(700, 10)
    rect.setTransformOriginPoint(rect.boundingRect().center())
    rect.setRotation(75)
    window.show()
    
    sys.exit(app.exec_())