显示图像时在最小化/最大化期间保留纵横比?

Posted

技术标签:

【中文标题】显示图像时在最小化/最大化期间保留纵横比?【英文标题】:Preserve aspect ratio during minimize/maximize when displaying image? 【发布时间】:2012-06-19 22:53:18 【问题描述】:

我正在尝试使用 qt creator 实现一个可扩展的图像小部件,该小部件将保留图像的纵横比。我发现的所有示例或帖子都建议扩展 QLabel 并重新实现 resizeEvent。这是我所做的,它几乎可以工作,但有一些问题。

    当主窗口第一次打开时,图像会稍微变大并扩大主窗口的大小(这不是太大的问题)。

    当我最大化窗口时,所有图像都会放大,但是当我取消最大化窗口时,图像无法缩小。

我尝试更改 QLabel 子类(称为 ClickableImage)和包含 ClickableImage 布局的父小部件的 resizeEvents。这是一些相关的代码。

void ClickableImage::resizeEvent(QResizeEvent *e)

    qDebug() << "Resizing : " << ticker;
    ticker++;

    int w = e->size().width();
    int h = e->size().height();

    qDebug() << "W : " << w;
    qDebug() << "H : " << h;

    image = QPixmap(fname);
    image = image.scaled(w-7, h-7, Qt::KeepAspectRatio);
    setPixmap(image);

另外,我已经阅读了以下资料,

Qt: resizing a QLabel, containing a QPixmap, while keeping it's aspect ratio

http://doc.trolltech.com/4.2/desktop-screenshot.html

谢谢。

【问题讨论】:

你的代码有bug,用一些乘法替换-7 对不起,我不明白。 -7 将像素图保持在 QLabel 的范围内。我应该乘以什么? 我应该很抱歉,我误读了您的代码,并认为您正在使用 7 进行缩放。您完全正确 【参考方案1】:

我有四件事你应该尝试。如果您放一个更大的代码示例,我可能会为您尝试,但这是我为您准备的:

    您可能需要在调整大小事件结束时调用adjustSize()。您可能不需要update() 呼叫,但您可以尝试在其中放置一个,看看是否有什么不同。

    minimize 事件应该与hideEvent() 相同,因此如果您希望它更改最小化时的图像大小,请将一些图像缩放也放在那里。

    Window and Dialog Widgets 上的文档可能有助于调整某些大小,但它也可能是在调整小部件大小时设置小部件大小的递归性质的一部分。

    所有这些的替代方法是让小部件为您确定调整大小。 QLabel 有一个选项可以让它根据它允许占用的大小来缩放它的内容,所以如果你创建一个 QLabel,设置它的像素图并设置缩放内容属性,那么它会自动为你做快速缩放调整大小。您可能仍需要将其缩小以最小化。

希望对您有所帮助。如果您仍有问题,请告诉我。

【讨论】:

以上是关于显示图像时在最小化/最大化期间保留纵横比?的主要内容,如果未能解决你的问题,请参考以下文章

保持最小/最大高度/宽度的纵横比?

显示具有自动调整的初始屏幕图像

调整图像大小并裁剪为新的纵横比

如何在正确保持纵横比的情况下进行缩放

在 UICollectionViewCell 中保留图像纵横比

如何在保持纵横比且不切断图像数据的情况下跨横向和纵向显示图像