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 в приведенном выше коде. Наслаждайтесь!

Другие вопросы по тегам