Question

J'écris un programme qui me permettra de télécharger des photos à TUMBLR via leur API, j'ai le travail de téléchargement (merci à vous les gars).

J'ai mis un « queueBox » du côté de l'interface graphique, qui affiche les noms d'image, et ils sont stockés dans un QListWidget. Je l'ai mis dans mon constructeur Classe principale:

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

et j'ai cette méthode:

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

Ceci dessine l'image sur sucessfully à MyLabel qui est un QLabel, cependant, il est très mis à l'échelle, je

self.myLabel.setScaledContents(True)

dans ma classe de ui_mainWindow, et si je retourne à faux, elle fixe la mise à l'échelle, mais il ne montre qu'une petite partie de l'image, car l'image est beaucoup plus grande que la QLabel. Ce que je veux être en mesure de maintenir le ratio d'aspect, il n'a pas l'air mis à l'échelle et horrible.

Je trouve ceci: http: //www.riverbankcomputing .co.uk / statique / docs / PyQt4 / html / qpixmap.html et il dit comment l'utiliser, mais je ne peux pas le faire au travail comme indiqué dans le code ci-dessus dans mes commentaires. Est-ce que quelqu'un sait comment l'utiliser? Si oui, pouvez-vous me donner un exemple, je l'ai essayé de chercher mais la plupart des résultats que je reçois sont des exemples de travail en C ++, python pas.

Merci!

Était-ce utile?

La solution

Débarrassez-vous de la

self.myLabel.setScaledContents(True)

appel (ou il est défini sur False). Il remplit votre widget avec le pixmap sans se soucier du rapport d'aspect.

Si vous avez besoin de redimensionner un QPixmap, comme vous l'avez trouvé, scaled est la méthode requise. Mais vous invoquez mal. Le regard de la définition Soit:

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

Retour type de cette fonction est QPixmap, il retourne une échelle copier de la pixmap originale.

Ensuite, vous avez besoin d'un width et un height, décrivant la (maximum) la taille finale du pixmap.

Deux paramètres optionnels. offres de aspectRatioMode avec le bien ratio d'aspect. La documentation détaille les différentes options et leurs effets. transformMode définit comment (l'algorithme) de l'échelle se fait. Il pourrait changer la qualité finale de l'image. Vous n'avez probablement pas besoin de celui-ci.

Alors, mettre ensemble, vous devriez avoir (espace de noms Qt est à l'intérieur QtCore):

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

Par ailleurs, si vous avez une taille fixe QLabel, vous pouvez appeler la méthode .size() pour obtenir la taille de celui-ci:

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

Remarque :. Vous pouvez utiliser os.path.join(directory, tempName) pour la partie directory + '\\' + tempName

Autres conseils

PyQt5 changement de code mise à jour:

La réponse ci-dessus Avaris avait besoin d'une mise à jour PyQt5 car il se casse.

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

Garder la self dans les résultats du code ci-dessous dans l'erreur de retraçage.

TypeError: arguments ne correspond à aucun appel surchargé: à l'échelle (auto, int, int, aspectRatioMode: Qt.AspectRatioMode = Qt.IgnoreAspectRatio, transformMode: Qt.TransformationMode = Qt.FastTransformation): Argument 1 a le type inattendu 'MainUI' mise à l'échelle (self, QSize, aspectRatioMode: Qt.AspectRatioMode = Qt.IgnoreAspectRatio, transformMode: Qt.TransformationMode = Qt.FastTransformation): L'argument 1 est de type inattendu 'MainUI'

Ainsi, ce devrait être (sans "auto", "Qt") comme indiqué ci-dessous:

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

ou

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

KeepAspectRatio = 4 ... mais utilisé tel que fourni par aspectRatioMode = 4 dans le code ci-dessus. Amusez-vous!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top