Ich habe versucht, Phyatt's AspectRatioPixmapLabel
Klasse zu verwenden, hatte aber einige Probleme:
- Manchmal trat meine App in eine Endlosschleife von Größenänderungsereignissen ein. Ich habe dies auf den Aufruf von
QLabel::setPixmap(...)
inside der resizeEvent-Methode zurückgeführt, da QLabel
tatsächlich updateGeometry
inside aufgerufen wird setPixmap
, was Größenänderungsereignisse auslösen kann ...
heightForWidth
schien vom enthaltenen Widget ( QScrollArea
in meinem Fall a) ignoriert zu werden, bis ich anfing, eine Größenrichtlinie für das Etikett festzulegen und explizit aufzurufenpolicy.setHeightForWidth(true)
- Ich möchte, dass das Etikett nie größer wird als die ursprüngliche Pixmap-Größe
QLabel
Die Implementierung von minimumSizeHint()
bewirkt etwas Magie für Beschriftungen, die Text enthalten, setzt jedoch die Größenrichtlinie immer auf die Standardrichtlinie zurück, sodass ich sie überschreiben musste
Das heißt, hier ist meine Lösung. Ich stellte fest, dass ich die Größenänderung einfach verwenden setScaledContents(true)
und durchführen lassen konnte QLabel
. Dies hängt natürlich davon ab, welches Widget / Layout das enthält heightForWidth
.
aspektratiopixmaplabel.h
#ifndef ASPECTRATIOPIXMAPLABEL_H
#define ASPECTRATIOPIXMAPLABEL_H
#include <QLabel>
#include <QPixmap>
class AspectRatioPixmapLabel : public QLabel
{
Q_OBJECT
public:
explicit AspectRatioPixmapLabel(const QPixmap &pixmap, QWidget *parent = 0);
virtual int heightForWidth(int width) const;
virtual bool hasHeightForWidth() { return true; }
virtual QSize sizeHint() const { return pixmap()->size(); }
virtual QSize minimumSizeHint() const { return QSize(0, 0); }
};
#endif
aspektratiopixmaplabel.cpp
#include "aspectratiopixmaplabel.h"
AspectRatioPixmapLabel::AspectRatioPixmapLabel(const QPixmap &pixmap, QWidget *parent) :
QLabel(parent)
{
QLabel::setPixmap(pixmap);
setScaledContents(true);
QSizePolicy policy(QSizePolicy::Maximum, QSizePolicy::Maximum);
policy.setHeightForWidth(true);
this->setSizePolicy(policy);
}
int AspectRatioPixmapLabel::heightForWidth(int width) const
{
if (width > pixmap()->width()) {
return pixmap()->height();
} else {
return ((qreal)pixmap()->height()*width)/pixmap()->width();
}
}