Qt - QLabel 不会以固定比例调整大小

Qt - QLabel won't resize with fixed ratio

简介

我正在 Qt Creator 中使用 Designer,并且有一个 QMainWindow 和一个 QLabel。因为程序加载图片并将它们显示在标签内,所以我希望标签在扩展或缩小 QMainWindow 时在设置的边界内以 1.25 的比例调整大小。标签应独立调整大小,再次独立于其内容。

我想要的:

1。方法:

因此我...

元素结构:

这不起作用,因为我无法在 'geometry' 部分设置初始大小。尽管标签尊重最小值和最大值,但它不会以固定比例缩放。

2。方法:

根据 that 的回答,我设置了一个初始像素图:

QPixmap p;
ui->imageLabel->setPixmap(p.scaled(640, 512, Qt::KeepAspectRatio));

这并没有改变任何东西。

3。方法:

我也应用了其他 answer 的 class 并将其推广到小部件:

这也没有任何改变。

4。方法:

然后我结合了 2. 和 3. 方法并设置了一个初始像素图...

...没有任何改变。

这是它对方法 1. - 4. 所做的:

5。方法

将4.approach的标签添加到widget中:

好吧,标签根本没有调整大小:

那么,如何让标签的初始大小为 640 x 512,并以固定比例在 1280 x 1024 和 320 x 256 之间缩放?

一个可能的解决方案是在 centralwidget 上安装一个 eventFilter,以便进行所需的计算来设置大小。

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->centralWidget->installEventFilter(this);
    ui->imageLabel->setPixmap(QPixmap(":/image.png"));
    ui->imageLabel->setScaledContents(true);
}

bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{
    const float ratio = 1.25;
    if(watched == ui->centralWidget && event->type() == QEvent::Resize
            && ui->centralWidget->width() > 0
            && ui->centralWidget->height() > 0){
        float central_ratio = 1.0*ui->centralWidget->width()/ui->centralWidget->height();        QSize s;
        if(central_ratio > ratio){
            s = QSize(ratio*ui->centralWidget->height(), ui->centralWidget->height());
        }
        else{
            s = QSize(ui->centralWidget->width(), ui->centralWidget->width()/ratio);
        }
        ui->imageLabel->resize(s);
    }
    return QMainWindow::eventFilter(watched, event);
}