PyQt5 QGraphicsPixmapItem旋转中心
PyQt5 QGraphicsPixmapItem center of rotation
我正在尝试使用 PyQt5 和 Qt Designer 制作一个简单的速度计。由于速度计箭头 self.arrow
的旋转,我遇到了问题。
这是代码:
class MyWin(QtWidgets.QMainWindow):
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.ui.speedSlider.valueChanged.connect(self.valuechange)
scene = QGraphicsScene()
scene.setSceneRect(0, 0, self.width(), self.height())
self.pixmap = QPixmap(":/img/img/speed_arrow.png")
self.arrow = scene.addPixmap(self.pixmap)
graphicsView = QGraphicsView(scene, self.ui.centralwidget)
graphicsView.setStyleSheet( "background-image:url(:/img/img/central1.png);\n"
"background-repeat:no-repeat;\n"
"background-position: center;\n"
"\n"
"border:none;")
self.ui.gridLayout.addWidget(graphicsView)
def valuechange(self):
angel = self.ui.speedSlider.value()
xform = QTransform()
xform.rotate(angel)
xformed_pixmap = self.pixmap.transformed(xform, Qt.SmoothTransformation)
self.arrow.setPixmap(xformed_pixmap)
#print(self.arrow.sceneBoundingRect())
我没有在代码中绘制速度计箭头,而是加载了一个
.
我还添加了一个滑块 self.ui.speedSlider
,用于确定旋转角度。
当我移动滑块时,实际上实现了箭头的旋转。问题是箭头没有围绕它的中心旋转。
如何固定旋转中心使其始终在箭头的中心self.arrow
?
这是 Ui_MainWindow 代码:
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
MainWindow.setStyleSheet("background-image:url(:/img/img/bgd.png);\n"
"possition:center;")
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName("gridLayout")
self.speedSlider = QtWidgets.QSlider(self.centralwidget)
self.speedSlider.setMaximum(99)
self.speedSlider.setOrientation(QtCore.Qt.Horizontal)
self.speedSlider.setObjectName("speedSlider")
self.gridLayout.addWidget(self.speedSlider, 1, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
箭头
中央 1
不要在值改变时变换像素图。转换像素图发生在本地像素图坐标系中,只会使事情复杂化。
而是在 self.arrow
上设置旋转。
- 使用
self.arrow.setTransformOriginPoint()
将旋转原点设置为针底的中心(几乎是像素图的宽度和高度的一半)。创建箭头后直接执行此操作。
- 每当值发生变化时使用
self.arrow.setRotation()
。它将围绕其原点旋转箭头项目,该原点是针的底部。
可以找到有关 QGraphicsItems 转换的更多信息here。
我正在尝试使用 PyQt5 和 Qt Designer 制作一个简单的速度计。由于速度计箭头 self.arrow
的旋转,我遇到了问题。
这是代码:
class MyWin(QtWidgets.QMainWindow):
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.ui.speedSlider.valueChanged.connect(self.valuechange)
scene = QGraphicsScene()
scene.setSceneRect(0, 0, self.width(), self.height())
self.pixmap = QPixmap(":/img/img/speed_arrow.png")
self.arrow = scene.addPixmap(self.pixmap)
graphicsView = QGraphicsView(scene, self.ui.centralwidget)
graphicsView.setStyleSheet( "background-image:url(:/img/img/central1.png);\n"
"background-repeat:no-repeat;\n"
"background-position: center;\n"
"\n"
"border:none;")
self.ui.gridLayout.addWidget(graphicsView)
def valuechange(self):
angel = self.ui.speedSlider.value()
xform = QTransform()
xform.rotate(angel)
xformed_pixmap = self.pixmap.transformed(xform, Qt.SmoothTransformation)
self.arrow.setPixmap(xformed_pixmap)
#print(self.arrow.sceneBoundingRect())
我没有在代码中绘制速度计箭头,而是加载了一个
我还添加了一个滑块 self.ui.speedSlider
,用于确定旋转角度。
当我移动滑块时,实际上实现了箭头的旋转。问题是箭头没有围绕它的中心旋转。
如何固定旋转中心使其始终在箭头的中心self.arrow
?
这是 Ui_MainWindow 代码:
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
MainWindow.setStyleSheet("background-image:url(:/img/img/bgd.png);\n"
"possition:center;")
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName("gridLayout")
self.speedSlider = QtWidgets.QSlider(self.centralwidget)
self.speedSlider.setMaximum(99)
self.speedSlider.setOrientation(QtCore.Qt.Horizontal)
self.speedSlider.setObjectName("speedSlider")
self.gridLayout.addWidget(self.speedSlider, 1, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
箭头
中央 1
不要在值改变时变换像素图。转换像素图发生在本地像素图坐标系中,只会使事情复杂化。
而是在 self.arrow
上设置旋转。
- 使用
self.arrow.setTransformOriginPoint()
将旋转原点设置为针底的中心(几乎是像素图的宽度和高度的一半)。创建箭头后直接执行此操作。 - 每当值发生变化时使用
self.arrow.setRotation()
。它将围绕其原点旋转箭头项目,该原点是针的底部。
可以找到有关 QGraphicsItems 转换的更多信息here。