QT窗口缩放——支持任意分辨率
作者:hws000(hws.000#163.com)
声明:版权所有,转载请联系作者。
出处:https://blog.simbot.net/index.php/2018/10/17/qtscalefont/
通过修改子窗口大小及字号,适应任意分辨率。
1.方法描述
(1)使用setMaximumSize、setMinimumSize函数修改子窗口大小,使其跟随主窗口变化;
(2)宽、高缩放比例不同时,通过qt的自动布局功能,调整子窗口的位置;
(3)通过setPointSizeF函数控制字体变化。
自动布局功能不讲解,只讲(1)(3)。
2.上代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
void MainWindow::resizeEvent(QResizeEvent* event) { QSize size = event->size(); float scaleX = size.width() / 1920.0f; //原始分辨率 float scaleY = size.height() / 1080.0f; float scale = std::min(scaleX, scaleY); //不是等比缩放时,选择最小的缩放比,可以通过自动布局调整窗口位置 const QObjectList& list = this ->children(); //枚举子窗口,并设置大小 foreach(QObject* obj, list) { if (obj->isWidgetType()) { QWidget* child = (QWidget*)obj; if (std:: abs (scale - _lastScale) > 0.03) { //当缩放比例超过阈值时才进行,因为窗口宽高是整数,频繁缩放会使窗口变形 scaleChildWidget(child, scale / _lastScale); } } } if (std:: abs (scale - _lastScale) > 0.03) { _lastScale = scale; } } void MainWindow::scaleChildWidget(QWidget* widget, float scale) { const QObjectList& list = widget->children(); foreach(QObject* obj, list) { if (obj->isWidgetType()) { QWidget* child = (QWidget*)obj; if (scale < 1) { scaleChildWidget(child, scale); //处理所有子窗口 } QSize max = child->maximumSize(); QSize min = child->minimumSize(); if (max.width() < 65536) { //子窗口需要设置初始值 child->setMaximumSize(max * scale); } if (min.width() > 0) { child->setMinimumSize(min * scale); } QFont font = child->font(); //缩放字体 font.setPointSizeF(font.pointSizeF() * scale); child->setFont(font); if (scale > 1) { scaleChildWidget(child, scale); } } } } |