查看: 2193|回复: 18

[C/C++] 有关Qt4.8的高DPI适配的问题

[复制链接]

0

技术

0

魅力

3

原创

略知一二

Rank: 3Rank: 3

积分
469
人气
12
分享
3
发表于 2021-10-3 11:13:39 | 显示全部楼层 |阅读模式
Qt4.8好像完全不支持高DPI识别。我的电脑是125%缩放(120DPI),我用Qt Creator设计的界面,在我看来大小正好,很协调,但是放到其他人的100%缩放的显示器上,就会显得很大,甚至占满大半个屏幕。这说明Qt完全没有根据DPI来调整UI元素的大小,而只是按照死板的像素值来绘制UI。这个问题已经困扰我较长时间。我不升级到Qt5,是因为qt5静态编译出现莫名其妙的问题,不要跟我说升级哈,谢谢。

但是,当我偶然发现WPS也是Qt4写的之后,我很震惊。因为它对高DPI的支持近乎完美。不光主程序是这样,就连“配置工具”也是。下面是一张对比图片:

(为了在100%的缩放下效果好一些,我故意将我的程序的UI元素设计的很小,但不影响对比)

可以看出,同样是Qt4写出的程序,我的程序显然不支持高DPI,无论什么样的DPI都是一样的绘制方式,需要系统缩放才能在高DPI显示器上放大;而WPS的配置工具显然具有高DPI自适配的功能,它依靠自己识别DPI而绘制出的窗口及其元素的大小,和系统缩放的几乎相同,而且更加清晰。这就说明,WPS软件在DPI不同的显示器下,显示效果几乎相同,都很完美。

我的问题是,如何让我的程序也做到这一点呢?恳请各位大佬前来帮助,万分感谢。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
C++/Win32领域的“小学生”。不断学习中。懒癌晚期,软件随缘更新。

1

技术

7

魅力

2

原创

管理员

Rank: 9Rank: 9Rank: 9

积分
6759
人气
207
分享
49

灌水之王论坛元老优秀版主活跃会员

发表于 2021-10-3 12:36:01 | 显示全部楼层
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

你试试把这句话加到main方法里
论坛事务联系邮箱 henry217@x64bbs.cn

0

技术

0

魅力

3

原创

略知一二

Rank: 3Rank: 3

积分
469
人气
12
分享
3
 楼主| 发表于 2021-10-3 16:35:25 | 显示全部楼层
henry217 发表于 2021-10-3 12:36
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

你试试把这句话加到main方法里 ...

qt4.8不支持啊 没办法,qt5静态编译出现莫名其妙的问题
C++/Win32领域的“小学生”。不断学习中。懒癌晚期,软件随缘更新。

1

技术

7

魅力

2

原创

管理员

Rank: 9Rank: 9Rank: 9

积分
6759
人气
207
分享
49

灌水之王论坛元老优秀版主活跃会员

发表于 2021-10-3 19:12:04 | 显示全部楼层
szx0427 发表于 2021-10-3 16:35
qt4.8不支持啊 没办法,qt5静态编译出现莫名其妙的问题

我现在用QT6了

你别搞老古董的版本。高版本即使无法静态编译,动态编译完了之后windeployqt找全dll也能运行
论坛事务联系邮箱 henry217@x64bbs.cn

0

技术

0

魅力

3

原创

略知一二

Rank: 3Rank: 3

积分
469
人气
12
分享
3
 楼主| 发表于 2021-10-4 09:59:08 | 显示全部楼层
本帖最后由 szx0427 于 2021-10-4 10:02 编辑
henry217 发表于 2021-10-3 19:12
我现在用QT6了

你别搞老古董的版本。高版本即使无法静态编译,动态编译完了之后windeployqt找全dll也能 ...

dll加一块体积太大了。一个小程序加上dll就得一百多兆。要不是因为这个我早就更新了
C++/Win32领域的“小学生”。不断学习中。懒癌晚期,软件随缘更新。

0

技术

0

魅力

3

原创

略知一二

Rank: 3Rank: 3

积分
469
人气
12
分享
3
 楼主| 发表于 2021-10-4 10:57:42 | 显示全部楼层
henry217 发表于 2021-10-3 12:36
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

你试试把这句话加到main方法里 ...

装了个qt5试了一下,这个缩放也很恶心。是整数倍缩放。125%=100%,150%=200%...完全不支持小数。
用QT_SCALE_FACTOR环境变量,有很奇怪的问题...按钮的边框会变化,一会大一会小,而且缩放系数不能低于1,不然问题更奇怪。
真的就没有任何办法了吗。。。
C++/Win32领域的“小学生”。不断学习中。懒癌晚期,软件随缘更新。

0

技术

0

魅力

3

原创

略知一二

Rank: 3Rank: 3

积分
469
人气
12
分享
3
 楼主| 发表于 2021-10-4 11:37:43 | 显示全部楼层
henry217 发表于 2021-10-3 19:12
我现在用QT6了

你别搞老古董的版本。高版本即使无法静态编译,动态编译完了之后windeployqt找全dll也能 ...

哈哈,自己想了个办法,也差不多能行。
方法:在主窗口类的初始化函数内添加如下代码
[C++] 纯文本查看 复制代码
qreal factor = logicalDpiX() / 120.0; // 除以120是因为我设计UI的屏幕是120DPI
resize(width()*factor, height()*factor);
QList<QWidget*> allControls = findChildren<QWidget*>();
for (int i=0; i<allControls.size(); i++)
{
    QWidget *wid = allControls[i];
    wid->move(wid->x()*factor, wid->y()*factor);
    wid->resize(wid->width()*factor, wid->height()*factor);
}


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

评分

参与人数 1人气 +2 收起 理由
henry217 + 2

查看全部评分

C++/Win32领域的“小学生”。不断学习中。懒癌晚期,软件随缘更新。

1

技术

7

魅力

2

原创

管理员

Rank: 9Rank: 9Rank: 9

积分
6759
人气
207
分享
49

灌水之王论坛元老优秀版主活跃会员

发表于 2021-10-4 17:18:35 | 显示全部楼层
szx0427 发表于 2021-10-4 09:59
dll加一块体积太大了。一个小程序加上dll就得一百多兆。要不是因为这个我早就更新了
...

写C# Winform吧,更快,更简单

如果你不考虑跨平台,可以用MFC
论坛事务联系邮箱 henry217@x64bbs.cn

0

技术

0

魅力

2

原创

初出茅庐

Rank: 2

积分
296
人气
13
分享
1
发表于 2021-10-4 17:54:41 | 显示全部楼层
henry217 发表于 2021-10-4 17:18
写C# Winform吧,更快,更简单

如果你不考虑跨平台,可以用MFC

他就是MFC转Qt,还是我安利的

0

技术

0

魅力

2

原创

初出茅庐

Rank: 2

积分
296
人气
13
分享
1
发表于 2021-10-4 17:58:15 | 显示全部楼层
话说我叫你用qt quick也不是没道理的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表