我正在编写一个程序,允许我通过他们的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。
谢谢!
答案 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
提供。享受!