3

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

我在 GUI 的一侧放置了一个“queueBox”,它显示图像名称,它们存储在 QListWidget 中。我把它放在我的主类的构造函数中:

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。

谢谢!

4

2 回答 2

10

摆脱

self.myLabel.setScaledContents(True)

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

如果您需要调整 a 的大小QPixmap,如您所见,这scaled是必需的方法。但是你调用它是错误的。让我们看一下定义:

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

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

然后你需要 awidth和 a height,描述像素图的(最大)最终大小。

另外两个可选参数。aspectRatioMode处理井纵横比。该文档详细说明了不同的选项及其效果。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部分。

于 2012-02-19T18:38:21.260 回答
1

PyQt5 代码变更更新:

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

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

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

TypeError:参数不匹配任何重载调用:缩放(self,int,int,aspectRatioMode:Qt.AspectRatioMode = Qt.IgnoreAspectRatio,transformMode:Qt.TransformationMode = Qt.FastTransformation):参数1具有意外类型'MainUI'缩放(self , QSize, aspectRatioMode: Qt.AspectRatioMode = Qt.IgnoreAspectRatio, transformMode: Qt.TransformationMode = Qt.FastTransformation): 参数 1 具有意外类型“MainUI”

因此这应该是(没有“self”,“Qt”),如下所述:

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

或者:

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

KeepAspectRatio = 2... 但按aspectRatioMode = 2上述代码提供的方式使用。享受!

于 2017-11-24T15:59:55.213 回答