QT自适应界面 处理高DPI 缩放比界面乱问题

19 篇文章 3 订阅

1.pro文件添加 必须添加要不找不到 QT版本需要 5。4 以上才支持

QT += widgets

2.main界面提前处理


    // 1. 全局缩放使能
    QApplication::setAttribute(Qt::AA_EnableHighDpiScaling, true);
    // 2. 适配非整数倍缩放
    QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);
    // 3. 适配字体渲染 hinting
    QFont font;
    font.setStyleStrategy(QFont::PreferAntialias);
    font.setHintingPreference(QFont::PreferFullHinting);
    QApplication::setFont(font);

2.1 使用了一些部分高dpi 好像没啥用处  有的电脑又可以需要自己挑选是否支持

    //    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling, true);
    //    QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps, true);


    // 启用高 DPI 缩放
    //     QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    //     QGuiApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
         QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);
    //     qputenv("QT_ENABLE_HIGHDPI_SCALING", "1");
    //     QApplication::setAttribute(Qt::AA_Use96Dpi);
    //     qputenv("QT_SCALE_FACTOR", "1");



        这个是Windows平台用来获取屏幕宽度的代码,
        因为在qApplication实例初始化之前,QGuiApplication::screens();无法使用。
    禁用缩放
    //    qputenv("QT_AUTO_SCREEN_SCALE_FACTOR", "0");
    //    QApplication::setAttribute(Qt::AA_DisableHighDpiScaling);

    //    QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
    //        env.insert("QT_ENABLE_HIGHDPI_SCALING", "0");
    //        qputenv("QT_ENABLE_HIGHDPI_SCALING", "0");
    //    qputenv("QT_SCALE_FACTOR", "1");
    //    qputenv("QT_ENABLE_HIGHDPI_SCALING", "1");
    //    QApplication::setAttribute(Qt::AA_Use96Dpi);
    禁用缩放  150 没什么效果
        QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
        env.insert("QT_ENABLE_HIGHDPI_SCALING", "0");
        qputenv("QT_ENABLE_HIGHDPI_SCALING", "0");
    测试发现AA_Use96Dpi属性在Qt5.9以上版本完全正常,以下版本比如5.7有部分控件在175%缩放不正常比如QTextEdit,需要外层套个widget才行。
    // #if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
    //     QApplication::setAttribute(Qt::AA_Use96Dpi);
    // #endif
    //     QCoreApplication::setAttribute(Qt::AA_DisableHighDpiScaling);

    //     if (qgetenv("QT_FONT_DPI").isEmpty())
    //     {
    //         qputenv("QT_FONT_DPI", "96");
    //         qputenv("QT_SCALE_FACTOR", "1.0");
    //     }
    //    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    //    qputenv("QT_AUTO_SCREEN_SCALE_FACTOR", "1");//设置界面跟随UI中设计的一样,取物理尺寸,不取分辨率尺寸显示

    //这个是修改界面的文本缩放大小
    //    这个是Windows平台用来获取屏幕宽度的代码,
    //    因为在qApplication实例初始化之前,QGuiApplication::screens();无法使用。
    //    qreal  cx = GetSystemMetrics(SM_CXSCREEN);
    //     qDebug()<<"cx:"<<cx;
    //    qreal scale = cx / 960;				// 960 = 1920 / 2
    //    qputenv("QT_SCALE_FACTOR", QString::number(scale).toLatin1());

High-DPI Support in QT

一、qt 从5.4版本开始支持高DPI,开启高DPI支持的方法是通过配置环境变量

1,添加环境变量 QT_DEVICE_PIXEL_RATIO = auto

2, 需要设置缩放比例 QT_SCALE_FACTOR,该值决定界面缩放的比例,只设置第一步不会看到界面尺寸的改变。

二、qt从5.6版本起,抛弃使用5.4版本中通过配置环境变量开启High-DPI的方法,改为通过调用API

	QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

 注意:该代码的调用必须在QApplication对象生成之前才能生效。示例如下:

int main(int argc, char *argv[])

{

QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
另外,这种方式的缩放比例支持整倍缩放,例如 125%会被当成1倍,150%、175%会被2倍缩放。

三、相关链接

http://blog.qt.io/blog/2016/01/26/high-dpi-support-in-qt-5-6/

http://doc.qt.io/qt-5/highdpi.html

总结一下:

  • main 函数加代码,支持缩放。
  • 确保所有尺寸单位使用 px,尤其是确保字体尺寸单位是 px 而非 pt。
  • 必须 Qt 5.14 以上版本。请删除之前用于适配 Qt 5.13 以前版本用的高分屏适配代码。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你的 QT 应用程序在 Windows 11 上没有正确缩放,可以尝试以下方法: 1. 使用 QT DPI 功能。在应用程序的 main 函数中添加以下代码: ``` QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); ``` 2. 将 QT 应用程序的 manifest 文件中的 DPIAware 属性设置为 true。在 QT 应用程序的 .pro 文件中添加以下代码: ``` win32: CONFIG += manifest ``` 然后在 QT 应用程序的资源文件中添加一个 manifest 文件,内容如下: ``` <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> <application> <!-- Windows 10 --> <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/> <!-- Windows 8.1 --> <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/> <!-- Windows 8 --> <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/> <!-- Windows 7 --> <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/> </application> </compatibility> <application xmlns="urn:schemas-microsoft-com:asm.v3"> <windowsSettings> <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware> </windowsSettings> </application> </assembly> ``` 3. 使用 QT 的 QWindowsVistaStyle 样式。在应用程序的 main 函数中添加以下代码: ``` QApplication::setStyle(new QWindowsVistaStyle); ``` 这些方法中的任何一种都可能解决 QT 应用程序在 Windows 11 上的缩放问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值