QPixmap保持纵横比

时间:2012-02-19 09:45:31

标签: python pyqt4 aspect-ratio qpixmap qlabel

我正在编写一个程序,允许我通过他们的API将照片上传到TUMBLR,我上传了工作(感谢你们)。

我在GUI的一侧放了一个'queueBox',它显示了图像名称,它们存储在QListWidget中。我把它放在我的Main Class'构造函数中:

def __init__(self):
    QtGui.QMainWindow.__init__(self)
    self.setupUi(self)
    self.queueBox.itemClicked.connect(self.displayPhoto)

我有这个方法:

def displayPhoto(self, item):
    tempName = (item.text())
    print tempName
    self.myLabel.setPixmap(QtGui.QPixmap(_fromUtf8(directory + '\\' + tempName)))  
    ## self.myLabel.pixmap(QPixmap.scaled(aspectRatioMode = Qt.IgnoreAspectRatio))
    ## ^ ^ ^ What do I do with this? How do I set it to maintain aspect ratio?
    ## Currently it says ''NameError: global name 'Qt' is not defined''

这成功地将图像绘制到myLabel,这是一个QLabel,然而,它是非常缩放的,我有

self.myLabel.setScaledContents(True)

在我的ui_mainWindow类中,如果我将其转换为False,它会修复缩放,但它只显示图像的一小部分,因为图像远大于QLabel。我想要的是能够保持纵横比,所以它看起来不会缩放和可怕。

我发现了这个:http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qpixmap.html 它说如何使用它,但我无法让它工作,如我的评论中的代码所示。有谁知道如何使用它?如果是这样,你能给我一个例子,我试过搜索,但我得到的大部分结果都是用C ++编写的例子,而不是python。

谢谢!

2 个答案:

答案 0 :(得分:8)

摆脱

self.myLabel.setScaledContents(True)

调用(或将其设置为False)。它使用像素图填充你的小部件而不关心宽高比。

如果您需要调整QPixmap的大小,正如您所发现的那样,scaled是必需的方法。但你错误地调用了它。我们来看看定义:

QPixmap QPixmap.scaled (self, 
                        int width, 
                        int height, 
                        Qt.AspectRatioMode aspectRatioMode = Qt.IgnoreAspectRatio,
                        Qt.TransformationMode transformMode = Qt.FastTransformation)

此函数的返回类型为QPixmap,因此它返回原始像素图的缩放副本

然后你需要一个width和一个height,描述像素图的(最大)最终尺寸。

另外两个可选参数。 aspectRatioMode处理井宽比。 documentation详细说明了不同的选项及其效果。 transformMode定义了缩放的完成方式(哪种算法)。它可能会改变图像的最终质量。你可能不需要这个。

所以,把它放在一起你应该(Qt命名空间在QtCore内):

# substitute the width and height to desired values
self.myLabel.setPixmap(QtGui.QPixmap(_fromUtf8(directory + '\\' + tempName)).scaled(width, height, QtCore.Qt.KeepAspectRatio))

或者,如果您使用固定尺寸QLabel,则可以调用.size()方法从中获取尺寸:

self.myLabel.setPixmap(QtGui.QPixmap(_fromUtf8(directory + '\\' + tempName)).scaled(self.myLabel.size(), QtCore.Qt.KeepAspectRatio))

注意:您可能希望将os.path.join(directory, tempName)用于directory + '\\' + tempName部分。

答案 1 :(得分:0)

PyQt5代码更改更新:

avaris的上述答案需要更新PyQt5,因为它会中断。

QPixmap.scaled (self, int width, int height, Qt.AspectRatioMode aspectRatioMode = Qt.IgnoreAspectRatio

在代码中保留self会导致以下追溯错误。

  

TypeError:arguments与任何重载调用都不匹配:scaled(self,int,int,aspectRatioMode:Qt.AspectRatioMode = Qt.IgnoreAspectRatio,transformMode:Qt.TransformationMode = Qt.FastTransformation):参数1具有意外类型&#39 ; MainUI' scaled(self,QSize,aspectRatioMode:Qt.AspectRatioMode = Qt.IgnoreAspectRatio,transformMode:Qt.TransformationMode = Qt.FastTransformation):参数1具有意外类型' MainUI'

因此,这应该是(没有"自我"," Qt"),如下所述:

QPixmap.scaled (int width, int height, aspectRatioMode = IgnoreAspectRatio

或:

QPixmap.scaled (int width, int height, aspectRatioMode = 0)

KeepAspectRatio = 4 ...但在上面的代码中由aspectRatioMode = 4提供。享受!