Pregunta

Estoy escribiendo un programa que me permitirá subir fotos a Tumblr a través de su API, tengo la carga funcionando (gracias a ustedes).

He puesto un 'QueueBox' en el costado 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 a MyLabel, que es un Qlabel, sin embargo, está muy escalado, tengo

self.myLabel.setScaledContents(True)

En mi clase UI_MainWindow, y si la giro a False, arregla la escala pero solo muestra una pequeña porción 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 escalado y horrible.

Encontré esto: http://www.riverbankcomputing.co.uk/static/docs/pyqt4/html/qpixmap.htmlY 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í, ¿puede proporcionarme un ejemplo? He intentado buscar, pero la mayoría de los resultados que obtengo son ejemplos de trabajo en C ++, no en Python.

¡Gracias!

¿Fue útil?

Solución

Deshacerse de

self.myLabel.setScaledContents(True)

Llame (o configúrelo en falso). Está llenando su widget con PixMap sin preocuparse por la relación de aspecto.

Si necesita cambiar el tamaño de un QPixmap, como has encontrado, scaled es el método requerido. 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 retorno de esta función es QPixmap, por lo que devuelve un escalado Copiar del PixMap original.

Entonces necesitas un width y un height, describiendo el tamaño final (máximo) del PIXMAP.

Dos parámetros opcionales más. aspectRatioMode Se ocupa de la relación de aspecto del pozo. los documentación detalla las diferentes opciones y sus efectos. transformMode Define cómo (qué algoritmo) se realiza la escala. Podría cambiar la calidad final de su imagen. Probablemente no necesite este.

Entonces, armarlo deberías tener (Qt El espacio de nombres está dentro 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 tamaño fijo QLabel, podrías llamar al .size() Método 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 usar os.path.join(directory, tempName) Para el directory + '\\' + tempName parte.

Otros consejos

Actualización de cambio de código PYQT5:

La respuesta anterior de avaris Necesitaba una actualización PYQT5 porque se rompe.

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

Manteniendo el self En el código da como resultado un siguiente error de traza.

TypeError: los argumentos no coincidían con ninguna llamada sobrecargada: Scaled (self, int, int, aspectratiomode: qt.aspectratiomode = qt.ignoreaspectratio, transformMode: Qt.TransformationMode = Qt.FastTransformation): 1 ha inesperado el tipo 'Mainui' escalado (AFELE , 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 "yo", "qt") como se indica a continuación:

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

o:

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

KeepSapectratio = 4 ... pero utilizado según lo dispuesto por aspectRatioMode = 4 en el código anterior. ¡Disfrutar!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top