我尝试使用phyatt的AspectRatioPixmapLabel
课程,但遇到了一些问题:
- 有时我的应用程序进入了大小调整事件的无限循环。我将此追溯到
QLabel::setPixmap(...)
resizeEvent方法内部的调用,因为QLabel
实际上是调用updateGeometry
inside setPixmap
,这可能会触发调整大小事件...
heightForWidth
似乎被包含的小部件(QScrollArea
在我的情况下为a)所忽略,直到我开始为标签设置尺寸策略,显式调用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();
}
}