Qt - QLabel 不会以固定比例调整大小
Qt - QLabel won't resize with fixed ratio
简介
我正在 Qt Creator 中使用 Designer,并且有一个 QMainWindow
和一个 QLabel
。因为程序加载图片并将它们显示在标签内,所以我希望标签在扩展或缩小 QMainWindow
时在设置的边界内以 1.25 的比例调整大小。标签应独立调整大小,再次独立于其内容。
我想要的:
- 第一次打开主window:
宽度:640,高度:512
- 缩主window:
标签以恒定比例 (640/512) 缩小到最小尺寸 (320 x 256)
- 扩展主window:
标签以恒定比例 (640/512) 扩展到最大尺寸 (1280 x 1024)
1。方法:
因此我...
- 在
QMainWindow
的 centralWidget
内添加了一个 QLabel
(称为 imageLabel
)
- 将
centralWidget
的布局设置为网格布局 (QGridLayout
)
- 将以下属性添加到
QLabel
:
- 几何 - 由于使用了网格布局,无法设置值!
- 最小尺寸 > 宽度:320,高度:256(最小值)
- maximumSize > 宽度:1280,高度:1024(最大值)
- sizePolicy > Horizontal Policy == Vertical Policy == Expanding
元素结构:
这不起作用,因为我无法在 '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);
}
简介
我正在 Qt Creator 中使用 Designer,并且有一个 QMainWindow
和一个 QLabel
。因为程序加载图片并将它们显示在标签内,所以我希望标签在扩展或缩小 QMainWindow
时在设置的边界内以 1.25 的比例调整大小。标签应独立调整大小,再次独立于其内容。
我想要的:
- 第一次打开主window:
宽度:640,高度:512 - 缩主window:
标签以恒定比例 (640/512) 缩小到最小尺寸 (320 x 256) - 扩展主window:
标签以恒定比例 (640/512) 扩展到最大尺寸 (1280 x 1024)
1。方法:
因此我...
- 在
QMainWindow
的 - 将
centralWidget
的布局设置为网格布局 (QGridLayout
) - 将以下属性添加到
QLabel
:- 几何 - 由于使用了网格布局,无法设置值!
- 最小尺寸 > 宽度:320,高度:256(最小值)
- maximumSize > 宽度:1280,高度:1024(最大值)
- sizePolicy > Horizontal Policy == Vertical Policy == Expanding
centralWidget
内添加了一个 QLabel
(称为 imageLabel
)
元素结构:
这不起作用,因为我无法在 '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);
}