对高分屏不同缩放比例的自适应处理方法
//方法1:在main函数的最前面加上下面这句 5.6版本才开始有这个函数
#if (QT_VERSION > QT_VERSION_CHECK(5,6,0))
QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif
//方法2:在可执行文件同目录下新建文件 qt.conf 填入下面内容
[Platforms]
WindowsArguments = dpiawareness=0
//方法3:在main函数最前面设置Qt内部的环境变量
qputenv("QT_AUTO_SCREEN_SCALE_FACTOR", "1.5");
//方法4:新版本的Qt比如Qt5.14修正了对高分屏的处理支持不是整数的缩放
qputenv("QT_ENABLE_HIGHDPI_SCALING", "1");
QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);
这几个的处理方式基本上都是按照等比放大来的。
QT里可以检测到DPI变化
QList<QScreen*> screens = QApplication::screens();
if (screens.size() > 0) {
QScreen* screen = screens[0];
connect(screen, &QScreen::logicalDotsPerInchChanged, this, &CLASSNAME::OnLogicalDotsPerInchChanged);
connect(screen, &QScreen::geometryChanged, this, &CLASSNAME::OnDeskTopResize);
}
//geometryChanged 这个是分辨率变化
CLASSNAME::OnDeskTopResize(qrect)
{
}
//这个是dpi变化
void CLASSNAME::OnLogicalDotsPerInchChanged(qreal dpi)
{
P_LOG_INFO("OnLogicalDotsPerInchChanged dpi:%f", dpi);
emit Sig_dpi_change();
}
dpi变化之后的第一次的渲染窗口的尺寸是会变化的。
在paintevent里面按dpi变化了。
我采用在Sig_dpi_change信号后重置一下窗口(我的需求是各种位置不变,当然变化的也可以这里写)
void WuYun::OnDpiChange()
{
//这里要设置回最初的尺寸。
const QObjectList& child_list = children();
for each (QObject* child in child_list)
{
QWidget* w = dynamic_cast<QWidget*>(child);
if (w)
w->repaint();
}
}
最终采用的解决方案是:
双管齐下。
qt.conf里设置来解决不同dpi下位置大小不对的问题。
[Platforms]
WindowsArguments = dpiawareness=0
并且监控dpi变化重置界面,来解决中途变化的问题。