gpt4 book ai didi

c++ - 如何在 Qt 中调整图像大小以按比例缩放?

转载 作者:IT老高 更新时间:2023-10-28 22:58:57 27 4
gpt4 key购买 nike

我创建了一个名为 ImageLabel 的类,它扩展了 QLabel。我希望它保持显示的图像的大小比例,无论它有多拉伸(stretch)。当您使窗口更大时,它可以正常工作。当您尝试使窗口更小时,问题就出现了:它不会调整高度,而是将其拉长。我该如何解决这个问题?


int ImageLabel::heightForWidth(int width) const {
int height = (this->size.height()*width)/this->size.width();
return height;
}

QSize ImageLabel::sizeHint() const {
return this->size;
}

QSize ImageLabel::minimumSizeHint() const {
return QSize(0, 0);
}

void ImageLabel::setSizePolicy(){
QSizePolicy policy = QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
policy.setHeightForWidth(true);
QLabel::setSizePolicy(policy);
QLabel::setScaledContents(true);
}

void ImageLabel::setPixmap ( const QPixmap &pixmap ){
this->size = pixmap.size();
QLabel::setPixmap(pixmap);
}

int main(int argc, char *argv[]){
QApplication a(argc, argv);

QFrame *frame = new QFrame;
QVBoxLayout *layout = new QVBoxLayout;
frame->setLayout(layout);

QPixmap map;
map.load("test.png");
ImageLabel *label = new ImageLabel;
label->setSizePolicy();
label->setPixmap(map);
layout->addWidget(label);
frame->show();

return a.exec();
}

最佳答案

有几种方法可以做到这一点,但最重要的是,我建议不要通过尝试暗示方面来对抗布局系统。如您所见,您必须尝试实现一些方法来帮助布局。

我可以举两个例子。他们都没有使用布局......

第一个使用子 QLabel 来显示图像,并将其固定大小从 resize 事件中移除:

// imagelabel.h

class ImageLabel : public QWidget
{
Q_OBJECT

public:
explicit ImageLabel(QWidget *parent = 0);
const QPixmap* pixmap() const;

public slots:
void setPixmap(const QPixmap&);

protected:
void resizeEvent(QResizeEvent *);

private slots:
void resizeImage();

private:
QLabel *label;
};

// imagelabel.cpp

ImageLabel::ImageLabel(QWidget *parent) :
QWidget(parent)
{
label = new QLabel(this);
label->setScaledContents(true);
label->setFixedSize(0,0);
}

void ImageLabel::resizeEvent(QResizeEvent *event) {
QWidget::resizeEvent(event);
resizeImage();
}

const QPixmap* ImageLabel::pixmap() const {
return label->pixmap();
}

void ImageLabel::setPixmap (const QPixmap &pixmap){
label->setPixmap(pixmap);
resizeImage();
}

void ImageLabel::resizeImage() {
QSize pixSize = label->pixmap()->size();
pixSize.scale(size(), Qt::KeepAspectRatio);
label->setFixedSize(pixSize);
}

第二个示例基于@Arnold_Spence 给出的答案。它甚至更短,因为它不使用子 QLabel。它只是在绘制事件中绘制像素图:

// imagelabel2.h

class ImageLabel2 : public QWidget
{
Q_OBJECT

public:
explicit ImageLabel2(QWidget *parent = 0);
const QPixmap* pixmap() const;

public slots:
void setPixmap(const QPixmap&);

protected:
void paintEvent(QPaintEvent *);

private:
QPixmap pix;
};

// imagelabel2.cpp

ImageLabel2::ImageLabel2(QWidget *parent) :
QWidget(parent)
{
}

void ImageLabel2::paintEvent(QPaintEvent *event) {
QWidget::paintEvent(event);

if (pix.isNull())
return;

QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);

QSize pixSize = pix.size();
pixSize.scale(event->rect().size(), Qt::KeepAspectRatio);

QPixmap scaledPix = pix.scaled(pixSize,
Qt::KeepAspectRatio,
Qt::SmoothTransformation
);

painter.drawPixmap(QPoint(), scaledPix);

}

const QPixmap* ImageLabel2::pixmap() const {
return &pix;
}

void ImageLabel2::setPixmap (const QPixmap &pixmap){
pix = pixmap;
}

关于c++ - 如何在 Qt 中调整图像大小以按比例缩放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14107144/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com