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

时间:2018-07-25 23:33:28

标签: c++ qt qt5 qt-designer qlabel

简介

我正在Qt Creator中与Designer一起工作,并且其中包含一个QMainWindow的{​​{1}}。因为程序会加载图片并将其显示在标签内,所以我希望在扩展或缩小QLabel时,标签在设置的边界内以1.25的比例进行调整大小。标签应调整INDEPENDENT的大小,并从其内容重新调整INDEPENDENT。

我想要什么:

  • 首次打开主窗口:
    宽度:640,高度:512
  • 缩小主窗口:
    标签以恒定比率(640/512)收缩直到最小尺寸(320 x 256)
  • 展开主窗口:
    标签以恒定比率(640/512)扩展到最大尺寸(1280 x 1024)

1。方法:

因此我...

  • QMainWindow的{​​{1}}内添加了QLabel(称为imageLabel
  • centralWidget的布局设置为网格布局(QMainWindow
  • 将以下属性添加到centralWidget
    • 几何-由于使用了网格布局,因此无法设置值!
    • minimumSize>宽度:320,高度:256(最小值)
    • maximumSize>宽度:1280,高度:1024(最大值)
    • sizePolicy>横向策略==纵向策略==扩展

元素结构:

Initial Element structure

这不起作用,因为我无法在“几何形状”部分中设置初始大小。标签虽然遵循最小值和最大值,但并未按固定比例缩放。

2。方法:

在回答that之后,我设置了初始像素图:

QGridLayout

什么都没改变。

3。方法:

我还应用了其他answer的类并将其提升为小部件:

Structure after promoting 'AspectRatioPixmapLabel' class

那也没什么改变。

4。方法:

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

...什么都没改变。

这是方法1.-4.的作用:

Approaches 1. - 4. - It's all the same

5。方法

在小部件中添加4.方法的标签:

5. approach element structure

标签完全不会调整大小:

5. approach result

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

1 个答案:

答案 0 :(得分:1)

一种可能的解决方案是将eventFilter安装到Centralwidget,以便进行所需的计算来设置大小。

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);
}