我正在尝试编写一个简单的应用程序,在按下按钮时旋转png图像。我把它全部工作得很好,除了当图像旋转时它偏离它在东南方向的中心。我原本以为它不是围绕它的中心旋转,而是每45度旋转一次返回原点,这很奇怪。
关键事件我只是打电话:
pixmap = pixmap.transformed(QtGui.QTransform().rotate(-self.rot), QtCore.Qt.SmoothTransformation)
有没有办法设置转换的原点以阻止图像移动?
答案 0 :(得分:3)
如果您使用QLabel绘制QPixmap,一个简单的解决方案是将QLabel的对齐方式设置为AlignCenter
。此外,为了避免在图像旋转的前45度期间初始调整QLabel的大小,可以将QLabel的最小尺寸设置为像素图的对角线的值。然后,图像应该在其中心周围正确旋转,而不会有任何不必要的来回平移。
下面我将演示如何在一个简单的应用程序中完成此操作:
import sys
from PyQt4 import QtGui, QtCore
import urllib
class myApplication(QtGui.QWidget):
def __init__(self, parent=None):
super(myApplication, self).__init__(parent)
#---- Prepare a Pixmap ----
url = ('http://sstatic.net/stackexchange/img/logos/' +
'careers/careers-icon.png?v=0288ba302bf6')
self.img = QtGui.QImage()
self.img.loadFromData(urllib.urlopen(url).read())
pixmap = QtGui.QPixmap(self.img)
#---- Embed Pixmap in a QLabel ----
diag = (pixmap.width()**2 + pixmap.height()**2)**0.5
self.label = QtGui.QLabel()
self.label.setMinimumSize(diag, diag)
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setPixmap(pixmap)
#---- Prepare a Layout ----
grid = QtGui.QGridLayout()
button = QtGui.QPushButton('Rotate 15 degrees')
button.clicked.connect(self.rotate_pixmap)
grid.addWidget(self.label, 0, 0)
grid.addWidget(button, 1, 0)
self.setLayout(grid)
self.rotation = 0
def rotate_pixmap(self):
#---- rotate ----
# Rotate from initial image to avoid cumulative deformation from
# transformation
pixmap = QtGui.QPixmap(self.img)
self.rotation += 15
transform = QtGui.QTransform().rotate(self.rotation)
pixmap = pixmap.transformed(transform, QtCore.Qt.SmoothTransformation)
#---- update label ----
self.label.setPixmap(pixmap)
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
instance = myApplication()
instance.show()
sys.exit(app.exec_())
结果是:
或者,如果您使用QPixmap
直接绘制QPainter
,此帖子can't get the image to rotate in center in Qt似乎可以解决您的问题。