QPixmap поддерживает соотношение сторон - PullRequest
2 голосов
/ 19 февраля 2012

Я пишу программу, которая позволит мне загружать фотографии в 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 ]

8 голосов
/ 19 февраля 2012

Избавьтесь от вызова

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 часть.

0 голосов
/ 24 ноября 2017

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...