QPixmap maintenir rapport d'aspect
-
27-10-2019 - |
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!
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!