在 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);
}
我的目标
这是我希望 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);
}