zoukankan      html  css  js  c++  java
  • Qt程序匹配Windows字体缩放

    问题

    Windows系统提供了字体缩放功能,当字体缩放比率变大时,应用程序也需要做相应的调整来匹配显示结果。
    Qt提供了一个熟悉来设置是否自动缩放。

    QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    

    但在启用这个属性后,只能是整数倍的缩放,比如125%是1倍,150%是2倍。这种效果是不能满足需求的。

    解决方案

    可以使用Windows提供的方法GetDeviceCaps来计算字体的缩放比率,然后通过设置环境变量QT_SCALE_FACTOR来设置任意大小的缩放比率,这种方式可以提供double类型的缩放。
    GetDeviceCaps需要在QApplication创建之后才能使用。这就需要首先启动一次程序,获取缩放比率,然后和当前程序设置的缩放比率进行对比,如果相同则继续执行,否则就将缩放比率写入注册表中,重启程序,在程序启动时首先从注册表中读取缩放比率并设置到环境变量中,然后再创建QApplication。之后继续判断系统的缩放比率和程序设置的缩放比率是否相同。
    代码如下

    #include "mainwindow.h"
    #include <QApplication>
    #include <QDebug>
    #include <QSettings>
    #include <QProcess>
    
    #include <windows.h>
    #include <wininet.h>
    
    #pragma comment(lib,"Wininet.lib")
    #pragma comment(lib,"Advapi32.lib")
    #pragma comment(lib, "user32.lib")
    #pragma comment(lib, "shell32.lib")
    #pragma comment(lib, "Gdi32.lib")
    
    
    
    const float DEFAULT_DPI = 96.0;
    
    using namespace std;
    
    float winDpiScaleEx()
    {
    #ifdef Q_OS_MAC
        return 1.0;
    #else
        float rt = 0;
        if (rt == 0) {
            HDC screen = GetDC(NULL);
            FLOAT dpiX = static_cast<FLOAT>( GetDeviceCaps( screen, LOGPIXELSX ) );
            ReleaseDC( 0, screen );
    
            rt = dpiX / DEFAULT_DPI;
            if (rt > 1)
                return rt * 0.8; //这里缩小了缩放比率,因为1.5倍或2倍会变得特别大
            return rt;
        }
        return rt;
    #endif
    }
    
    int main(int argc, char *argv[])
    {    
        QSettings settings(QSettings::NativeFormat, QSettings::UserScope,
                  "Shanghai", "Client_debug");
    
        QString ba = settings.value("QT_SCALE_FACTOR").toByteArray();
        qDebug() << ba;
        if (!ba.isEmpty()) {
            qputenv("QT_SCALE_FACTOR", ba.toUtf8());
        }
    
        QApplication a(argc, argv);
    
    
        qDebug() << qgetenv("QT_SCALE_FACTOR");
    
        QString newba = QString::number((double)winDpiScaleEx());
        if (ba.compare(newba) != 0) {
            settings.setValue("QT_SCALE_FACTOR", newba);
            QProcess::startDetached(QString::fromLocal8Bit(argv[0]), QStringList());
            return 0;
        }
    
    
        qDebug() << QString::number((double)winDpiScaleEx()).toUtf8();
    
        MyMainWindow w;
        w.show();
    
    
    
        return a.exec();
    }
    
  • 相关阅读:
    转载
    .gitignore配置(清除缓存)
    Servlet: Servlet接收中文乱码
    Servlet: ServletResponse接口 & HttpServletResponse接口
    Servlet: ServletRequest接口 & HttpServletRequest接口
    Servlet: GET请求 & POST请求
    Servlet: Servlet的概念和使用
    Servlet: Tomcat服务器
    Servlet: HTTP协议
    Servlet:C/S、B/S、JavaWeb的概念
  • 原文地址:https://www.cnblogs.com/vectorli/p/9207308.html
Copyright © 2011-2022 走看看