QPixmap поддерживает соотношение сторон
Я пишу программу, которая позволит мне загружать фотографии в TUMBLR через их API, загрузка у меня работает (спасибо вам, ребята).
Я поместил "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.
Спасибо!
2 ответа
Избавиться от
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
имеет дело с, хорошо соотношение сторон. В документации подробно описаны различные варианты и их эффекты. 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
часть.
Обновление изменения кода PyQt5:
Приведенный выше ответ Avaris требовал обновления PyQt5, потому что оно ломалось.
QPixmap.scaled (self, int width, int height, Qt.AspectRatioMode aspectRatioMode = Qt.IgnoreAspectRatio
Держать self
в коде ниже приведена ошибка трассировки.
TypeError: аргументы не соответствуют ни одному перегруженному вызову: scaled(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 = 4... но используется как указано aspectRatioMode = 4
в приведенном выше коде. Наслаждайтесь!