Вопрос

Я пишу программу, которая позволит мне загружать фотографии в Tumblr через их API, у меня работает загрузка (спасибо вам, ребята).

Я положил «очередь» на сторону графического интерфейса, который отображает имена изображений, и они хранятся в 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.

Спасибо!

Это было полезно?

Решение

Избавиться от

self.myLabel.setScaledContents(True)

вызовите (или установите его на false). Он заполняет ваш виджет PixMap, не заботясь о соотношении сторон.

Если вам нужно изменить размер QPixmap, как вы нашли, scaled требуемый метод. Но вы ссылаетесь на это неправильно. Давайте посмотрим на определение:

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

Возврат типа этой функции QPixmap, так что он возвращает масштабированные копия оригинальной Pixmap.

Тогда вам нужен width и height, описывая (максимальный) конечный размер PixMap.

Еще два дополнительных параметра. 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:

Вышеупомянутый ответ Аварис Нужно было обновление PYQT5, потому что оно ломается.

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

Сохраняя self в коде приводит к ошибке Traceback.

TypeError: аргументы не соответствовали ни одному перегруженному вызову: масштабированный (self, int, int, apectratiomode: qt.aspectratiomode = qt.ignoreaspectratio, transformmode: qt.transformationmode = qt.fasttransformation): аргумент 1 имеет неожиданный тип 'mainui' scaveled (self. , Qsize, Appectratiomode: 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 в вышеупомянутом коде. Наслаждаться!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top