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 以前版本用的高分屏适配代码。