Python PyQt5 QGraphicsPixPitem旋转中心

Python PyQt5 QGraphicsPixPitem旋转中心,python,rotation,pyqt5,qgraphicspixmapitem,Python,Rotation,Pyqt5,Qgraphicspixmapitem,我正在尝试使用PyQt5和Qt设计器制作一个简单的速度表。由于车速表箭头的旋转,我有一个问题。self.arrow。 代码如下: classmywin(qtwidts.QMainWindow): def uuu init uuu(self,parent=None): qtwidts.QWidget.\uuuuu init\uuuuuuu(self,parent) self.ui=ui\u主窗口() self.ui.setupUi(self) self.ui.speedSlider.valueCh

我正在尝试使用PyQt5和Qt设计器制作一个简单的速度表。由于车速表箭头的旋转,我有一个问题。
self.arrow

代码如下:

classmywin(qtwidts.QMainWindow):
def uuu init uuu(self,parent=None):
qtwidts.QWidget.\uuuuu init\uuuuuuu(self,parent)
self.ui=ui\u主窗口()
self.ui.setupUi(self)
self.ui.speedSlider.valueChanged.connect(self.valuechange)
场景=qgraphicscene()
scene.setscen直立(0,0,self.width(),self.height())
self.pixmap=QPixmap(:/img/img/speed\u arrow.png)
self.arrow=scene.addPixmap(self.pixmap)
graphicsView=QGraphicsView(场景,self.ui.centralwidget)
graphicsView.setStyleSheet(“背景图像:url(:/img/img/central1.png);\n”
“背景重复:无重复;\n”
“背景位置:中间;\n”
“\n”
“边框:无;”)
self.ui.gridLayout.addWidget(graphicsView)
def值更改(自身):
angel=self.ui.speedSlider.value()
xform=QTransform()
变换。旋转(角度)
xformed_pixmap=self.pixmap.transformed(xform,Qt.SmoothTransformation)
self.arrow.setPixmap(xformed_pixmap)
#打印(self.arrow.sceneboundingdirect())
我没有在代码中绘制速度表箭头,而是加载了一个

我还添加了一个滑块
self.ui.speedSlider
,可以用来确定旋转角度

当我移动滑块时,实际上实现了箭头的旋转。问题是箭头不绕其中心旋转

如何固定旋转中心,使其始终位于箭头的中心
self.arrow

这是Ui_主窗口代码:

class Ui\u主窗口(对象):
def设置UI(自我,主窗口):
MainWindow.setObjectName(“MainWindow”)
主窗口。调整大小(800600)
MainWindow.setStyleSheet(“背景图像:url(:/img/img/bgd.png);\n”
“位置:中间;”)
self.centralwidget=qtwidts.QWidget(主窗口)
self.centralwidget.setObjectName(“centralwidget”)
self.gridLayout=qtwidts.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName(“gridLayout”)
self.speedSlider=qtwidts.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=qtwidts.QMenuBar(主窗口)
self.menubar.setGeometry(QtCore.QRect(0,0800,21))
self.menubar.setObjectName(“menubar”)
MainWindow.setMenuBar(self.menubar)
self.statusbar=qtwidts.QStatusBar(主窗口)
self.statusbar.setObjectName(“statusbar”)
main window.setStatusBar(self.statusbar)
自重传(主窗口)
QtCore.QMetaObject.connectSlotsByName(主窗口)
def重新传输(自身,主窗口):
_translate=QtCore.QCoreApplication.translate
setWindowTitle(_translate(“MainWindow”、“MainWindow”))

中央1


无论值何时更改,都不要变换pixmap。转换pixmap发生在本地pixmap坐标系中,只会使事情复杂化

相反,将旋转设置为
self.arrow

  • 使用
    self.arrow.setTransformOriginPoint()
    将旋转原点设置为针座的中心(因此几乎等于像素贴图的宽度,其高度的一半)。创建箭头后直接执行此操作
  • 每当值更改时,使用self.arrow.setRotation()。它将围绕其原点(针的底部)旋转箭头项

  • 有关QGraphics站点转换的更多信息,请参见。

    共享Ui\u主窗口和central1.png,speed\u箭头。png@eyllanesc我刚刚添加了Ui_主窗口代码、central1.png和speed_arrow。png@Marko与问题本身无关,但请注意主窗口样式表中有一个输入错误:有一个额外的“s”在
    位置:居中
    @musicamante感谢您的关注。根据更新的问题,原点可以使用
    self.arrow.boundingRect().center()
    self.pixmap.rect().center()
    @ypnos直接放置。在我的例子中,我也使用了一半的宽度,因为我在图片的右侧有一个空白。如果没有空的空间,我几乎会使用整个宽度(有一个小的偏移)。非常感谢你。