gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:58:47 27 4
gpt4 key购买 nike

介绍

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

我想要什么:

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

1。方法:

因此我...

  • QMainWindowcentralWidget 中添加了一个 QLabel(称为 imageLabel)
  • 设置centralWidget的布局为网格布局(QGridLayout)
  • 将以下属性添加到 QLabel:
    • 几何 - 由于使用了网格布局,无法设置值!
    • minimumSize > 宽度:320,高度:256(最小值)
    • maximumSize > 宽度:1280,高度:1024(最大值)
    • sizePolicy > Horizo​​ntal Policy == Vertical Policy == Expanding

元素结构:

Initial Element structure

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

2。方法:

正在关注 that回答我设置了一个初始像素图:

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

这并没有改变任何东西。

3。方法:

我还申请了另一个answer的类并将其提升到小部件:

Structure after promoting 'AspectRatioPixmapLabel' class

这也没有改变任何东西。

4。方法:

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

...没有任何改变。

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

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

5。方法

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

5. approach element structure

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

5. approach result

那么,如何让标签的初始尺寸为 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);
}

关于c++ - Qt - QLabel 不会以固定比例调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51529055/

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