Tôi đã thử sử dụng AspectRatioPixmapLabel
lớp của phyatt , nhưng gặp một số vấn đề:
- Đôi khi ứng dụng của tôi đi vào một vòng lặp vô hạn các sự kiện thay đổi kích thước. Tôi lần theo dấu vết này để gọi
QLabel::setPixmap(...)
bên trong phương thức resizeEvent, bởi vì QLabel
thực sự các lệnh gọi updateGeometry
bên trong setPixmap
, có thể kích hoạt các sự kiện thay đổi kích thước ...
heightForWidth
dường như bị bỏ qua bởi tiện ích con chứa ( QScrollArea
trong trường hợp của tôi) cho đến khi tôi bắt đầu thiết lập chính sách kích thước cho nhãn, gọi một cách rõ ràngpolicy.setHeightForWidth(true)
- Tôi muốn nhãn không bao giờ lớn hơn kích thước bản đồ gốc
QLabel
Việc triển khai thực hiện minimumSizeHint()
một số điều kỳ diệu đối với các nhãn chứa văn bản, nhưng luôn đặt lại chính sách kích thước về chính sách mặc định, vì vậy tôi đã phải ghi đè nó
Điều đó nói rằng, đây là giải pháp của tôi. Tôi thấy rằng tôi chỉ có thể sử dụng setScaledContents(true)
và để QLabel
xử lý việc thay đổi kích thước. Tất nhiên, điều này phụ thuộc vào widget / bố cục chứa heightForWidth
.
surfaceratiopixmaplabel.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
surfaceratiopixmaplabel.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();
}
}