QPixmap mantener la relación de aspecto

Estoy escribiendo un progtwig que me permitirá subir fotos a TUMBLR a través de su API, tengo la carga en funcionamiento (gracias a ustedes).

He puesto un ‘queueBox’ en el lado de la GUI, que muestra los nombres de las imágenes, y se almacenan en un QListWidget. He puesto esto en el constructor de mi clase principal:

def __init__(self): QtGui.QMainWindow.__init__(self) self.setupUi(self) self.queueBox.itemClicked.connect(self.displayPhoto) 

Y tengo este método:

 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'' 

Esto dibuja con éxito la imagen en myLabel, que es una QLabel, sin embargo, está muy escalada, tengo

 self.myLabel.setScaledContents(True) 

en mi clase ui_mainWindow, y si la cambio a Falso, corrige la escala, pero solo muestra una pequeña parte de la imagen porque la imagen es mucho más grande que la QLabel. Lo que quiero es poder mantener la relación de aspecto, para que no se vea a una escala y sea horrible.

    Encontré esto: http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qpixmap.html y dice cómo usarlo, sin embargo, no puedo hacer que funcione como se muestra en el código anterior. en mis comentarios ¿Alguien sabe cómo usar esto? Si es así, ¿puedes darme un ejemplo? He intentado buscar, pero la mayoría de los resultados que obtengo son ejemplos funcionales en C ++, no en python.

    ¡Gracias!

    Deshacerse de

     self.myLabel.setScaledContents(True) 

    llamar (o configurarlo en falso). Está llenando tu widget con el mapa de píxeles sin importar la relación de aspecto.

    Si necesita cambiar el tamaño de un QPixmap , como lo ha encontrado, el método requerido es el scaled . Pero lo estás invocando mal. Veamos la definición:

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

    El tipo de devolución de esta función es QPixmap , por lo que devuelve una copia escalada del pixmap original.

    Luego necesita un width y una height , que describa el tamaño final (máximo) del mapa de píxeles.

    Dos parámetros opcionales más. aspectRatioMode ocupa de la relación de aspecto, así. La documentación detalla las diferentes opciones y sus efectos. transformMode define cómo (qué algoritmo) se realiza el escalado. Podría cambiar la calidad final de su imagen. Probablemente no necesites este.

    Entonces, juntándolo, deberías tener (espacio de nombres Qt está dentro de QtCore ):

     # substitute the width and height to desired values self.myLabel.setPixmap(QtGui.QPixmap(_fromUtf8(directory + '\\' + tempName)).scaled(width, height, QtCore.Qt.KeepAspectRatio)) 

    Alternativamente, si tiene un QLabel tamaño fijo, puede llamar al método .size() para obtener el tamaño:

     self.myLabel.setPixmap(QtGui.QPixmap(_fromUtf8(directory + '\\' + tempName)).scaled(self.myLabel.size(), QtCore.Qt.KeepAspectRatio)) 

    Nota : es posible que desee utilizar os.path.join(directory, tempName) para el directory + '\\' + tempName .

    Actualización de cambio de código de PyQt5:

    La respuesta anterior de avaris necesitaba una actualización de PyQt5 porque se rompe.

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

    Mantener el self en el código da como resultado un error de rastreo inferior.

    TypeError: los argumentos no coincidían con ninguna llamada sobrecargada: escalado (self, int, int, aspectRatioMode: Qt.AspectRatioMode = Qt.IgnoreAspectRatio, transformMode: Qt.TransformationMode = Qt.FastTransformation): argumento 1 tiene tipo inesperado , QSize, aspectRatioMode: Qt.AspectRatioMode = Qt.IgnoreAspectRatio, transformMode: Qt.TransformationMode = Qt.FastTransformation): el argumento 1 tiene un tipo inesperado ‘MainUI’

    Por lo tanto, esto debería ser (sin “self”, “Qt”) como se indica a continuación:

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

    o:

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

    KeepAspectRatio = 4 … pero se usa tal como lo proporciona aspectRatioMode = 4 en el código anterior. ¡Disfrutar!