在 C++ 中用 QPixmap 覆盖 QLabel

Cover QLabel with QPixmap in C++

我的目标

这是我希望 QPixmap 包含在 QLabel 中的示例。图像保持其纵横比并填充给定的尺寸。它将被剪裁以适合。

这是 CSS 等价物:

object-fit: cover;

当前代码

几乎做了我想要的,但它拉伸了图像以覆盖QLabel,所以宽高比没有保留。

QPixmap *img = new QPixmap("image.png");
ui->label->setPixmap(*img);
ui->label->setScaledContents(true);
delete img;

可以使用 QTransform 作为 QWidget 子类实现。

class Label : public QWidget
{
    Q_OBJECT
public:
    explicit Label(QWidget *parent = nullptr);
    void setPixmap(const QPixmap& image);
protected:
    void paintEvent(QPaintEvent *event);
    QPixmap mPixmap;
};

Label::Label(QWidget *parent) : QWidget(parent) {

}

void Label::setPixmap(const QPixmap &pixmap)
{
    mPixmap = pixmap;
    update();
}

void Label::paintEvent(QPaintEvent *event)
{
    if (mPixmap.isNull()) {
        return;
    }
    double width = this->width();
    double height = this->height();
    double pixmapWidth = mPixmap.width();
    double pixmapHeight = mPixmap.height();
    double scale = qMax(width / pixmapWidth, height / pixmapHeight);
    QTransform transform;
    transform.translate(width / 2, height / 2);
    transform.scale(scale, scale);
    transform.translate(-pixmapWidth / 2, -pixmapHeight / 2);
    QPainter painter(this);
    painter.setTransform(transform);
    painter.drawPixmap(QPoint(0,0), mPixmap);
}