2009-10-27 6 views
1

Si vous avez un QImage enveloppé dans un QLabel, est-il possible de l'augmenter ou de le réduire lorsque vous redimensionnez la fenêtre et maintenez le rapport d'aspect (pour que l'image ne soit pas déformée)? J'ai compris qu'il pouvait évoluer en utilisant setScaledContents(), et vous pouvez définir une taille minimum et maximum, mais l'image perd toujours son aspect.Comment autoriser la mise à l'échelle avec un rapport d'aspect uniforme en (Py) Qt?

Ce serait génial si cela pouvait être expliqué en utilisant Python (puisque je ne connais pas C++), mais je vais prendre ce que je peux obtenir. :-)

Merci d'avance!

Répondre

2

Je montre cela en C++, ce qui est la documentation que je regarde. Il ne devrait pas être trop difficile à convertir en python.

Vous devez créer une dérivée personnalisée de QLayoutItem, qui remplace bool hasHeightForWidth() et int heightForWidth(int width) pour préserver le rapport d'aspect en quelque sorte. Vous pouvez soit faire passer l'image et l'interroger, ou vous pouvez simplement définir le ratio directement. Vous devrez également vous assurer que la fonction widget() renvoie un pointeur vers l'étiquette appropriée. Une fois cela fait, vous pouvez ajouter un élément de mise en page à une mise en page de la même manière que vous le feriez d'un widget. Ainsi, lorsque votre étiquette est ajoutée, modifiez-la pour utiliser votre classe d'éléments de mise en page personnalisée.

Je n'ai pas encore testé cela, donc c'est une solution théorique à ce stade. Je ne connais aucun moyen de faire cette solution à travers le concepteur, si cela était souhaité.

+0

Salut merci! On dirait que ça marchera probablement, mais je pense que je pourrais juste le laisser glisser pour l'instant. Je pense que cela dépasse la portée de mes capacités Qt et mon échéance arrive plus tôt que je ne le souhaiterais. Je vais essayer de revenir là-dessus après que je me rapproche de la finition et que je revienne avec vous! – jgoney

0

Convertissez l'image en QPixmap (utilisez QPixmap.fromImage(img)), puis, vous pouvez utiliser scaledToHeight().

+0

Merci Aaron! Cela ne fait pas tout à fait ce que je cherche. Cela met à l'échelle statiquement l'image (QPixmap) lors de la création, mais il ne se redimensionne pas lorsque je redimensionne la fenêtre. D'autres idées? – jgoney

+0

Dans ce cas, ne mettez pas à l'échelle mais placez un QLabel dans la fenêtre et appelez 'setPixmap()' dessus. Qt va alors redimensionner l'image avec l'étiquette et il * devrait * préserver l'aspect. –

+0

Salut! Merci encore. La définition d'un QPixmap n'a pas évolué, mais il est bon de savoir que je peux le définir directement avec un Pixmap plutôt que de définir un QImage en premier. – jgoney