phyatt의 AspectRatioPixmapLabel
수업을 사용해 보았지만 몇 가지 문제가 발생했습니다.
- 때때로 내 앱이 크기 조정 이벤트의 무한 루프에 들어갔습니다. 실제로 내부를 호출하여 크기 조정 이벤트를 트리거 할 수
QLabel::setPixmap(...)
있기 때문에이 함수를 다시 resizeEvent 메서드 내부 호출로 추적했습니다 .QLabel
updateGeometry
setPixmap
heightForWidth
QScrollArea
레이블에 대한 크기 정책을 설정하기 시작할 때까지 포함하는 위젯 ( 제 경우에는)에서 무시한 것처럼 보였습니다.policy.setHeightForWidth(true)
- 라벨이 원래 픽스맵 크기 이상으로 커지지 않기를 바랍니다.
QLabel
의 구현은 minimumSizeHint()
텍스트를 포함하는 레이블에 대해 약간의 마법을 수행하지만 항상 크기 정책을 기본값으로 재설정하므로 덮어 써야했습니다
즉, 여기 내 해결책이 있습니다. 크기 조정을 사용 setScaledContents(true)
하고 QLabel
처리 할 수 있다는 것을 알았습니다 . 물론 이것은 포함 된 위젯 / 레이아웃에 따라 heightForWidth
.
aspectratiopixmaplabel.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
aspectratiopixmaplabel.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();
}
}