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()
确实旋转了标签,但改变了它的位置。在评论旋转线时,它位于正确的位置。
您的代码中存在一些问题和误解。
- 不鼓励任意添加小部件和设置固定几何形状,因为应该使用 layout managers;
- 不应将小部件添加到 QMainWindow 只是通过将它们作为父级添加到 QMainWindow 中,而是通过将它们设置为它们的 central widget; the central widget is installed in the internal layout manager of the QMainWindow using
setCentralWidget()
;
- a QGraphicsView 根据场景内容的边界矩形自动设置 visible/scrollable
scene rectangle
;
- 项目总是创建时 position 为
0,0
;使用 100, 100, 50, 50
创建的 QGraphicsRectItem 将在 0,0
添加一个 positioned 的项目,并在 100,100
;[=52= 处绘制 50x50
矩形]
- 转换(包括旋转)始终默认为
0,0
的 origin point
;
setTransform
应用于当前变换,不考虑变换原点;如果要旋转项目,请使用 setRotation()
;
考虑到上述情况,如果您想要一个矩形 placed at 700,10
并围绕其原点旋转 75 度,您应该添加一个 QGraphicsRectItem,其坐标为 0, 0, 100, 50
和 移动 在 700,10
。请注意,如前所述,变换原点始终位于 0,0
而 setTransform
会忽略这一点,因此如果您想围绕其中心旋转它,您也应该设置该点:
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_())
我有一个带有 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()
确实旋转了标签,但改变了它的位置。在评论旋转线时,它位于正确的位置。
您的代码中存在一些问题和误解。
- 不鼓励任意添加小部件和设置固定几何形状,因为应该使用 layout managers;
- 不应将小部件添加到 QMainWindow 只是通过将它们作为父级添加到 QMainWindow 中,而是通过将它们设置为它们的 central widget; the central widget is installed in the internal layout manager of the QMainWindow using
setCentralWidget()
; - a QGraphicsView 根据场景内容的边界矩形自动设置 visible/scrollable
scene rectangle
; - 项目总是创建时 position 为
0,0
;使用100, 100, 50, 50
创建的 QGraphicsRectItem 将在0,0
添加一个 positioned 的项目,并在100,100
;[=52= 处绘制50x50
矩形] - 转换(包括旋转)始终默认为
0,0
的origin point
; setTransform
应用于当前变换,不考虑变换原点;如果要旋转项目,请使用setRotation()
;
考虑到上述情况,如果您想要一个矩形 placed at 700,10
并围绕其原点旋转 75 度,您应该添加一个 QGraphicsRectItem,其坐标为 0, 0, 100, 50
和 移动 在 700,10
。请注意,如前所述,变换原点始终位于 0,0
而 setTransform
会忽略这一点,因此如果您想围绕其中心旋转它,您也应该设置该点:
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_())