我试着用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_H
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();
}
}
通过动态变化你是指像素数据还是维度? –
我指的是当前布局中'QLabel'的尺寸。 QPixmap应该保持其大小,内容和维度。此外,调整大小(实际上缩小)会“自动地”发生,以填充可用空间 - 最初为“QPixmap”的大小。所有这些都是通过子类化来完成的...... – marvin2k