1.pro文件添加 必须添加要不找不到 QT版本需要 5。4 以上才支持
QT += widgets
2.main界面提前处理
// 1. 全局缩放使能QApplication::setAttribute(Qt::AA_EnableHighDpiScaling, true);// 2. 适配非整数倍缩放QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);// 3. 适配字体渲染 hintingQFont 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 以前版本用的高分屏适配代码。