在Main函数开头调用HighDpiAdapt()函数
#include "HighDpiAdapt.h"
#include <iostream>
#include <QGuiApplication>
#include <Windows.h>
#include <WinUser.h>
using namespace std;
//将wstring转换成string
string wstring2string(wstring wstr)
{
string result;
//获取缓冲区大小,并申请空间,缓冲区大小事按字节计算的
int len = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), wstr.size(), NULL, 0, NULL, NULL);
char* buffer = new char[len + 1];
//宽字节编码转换成多字节编码
WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), wstr.size(), buffer, len, NULL, NULL);
buffer[len] = '\0';
//删除缓冲区并返回值
result.append(buffer);
delete[] buffer;
return result;
}
void HighDpiAdapt(){
// 获取当前显示器的数目
int numbers = GetSystemMetrics(SM_CMONITORS);
string scale_name = "";
for (int i = 0; i < numbers; ++i)
{
DISPLAY_DEVICEW device;
device.cb = sizeof(device);
BOOL result = EnumDisplayDevicesW(NULL, i, &device, 0);
DEVMODEW device_mode;
device_mode.dmSize = sizeof(device_mode);
device_mode.dmDriverExtra = 0;
result = EnumDisplaySettingsExW(device.DeviceName, ENUM_CURRENT_SETTINGS, &device_mode, 0);
string screen_name = wstring2string(device.DeviceName);
scale_name += screen_name;
scale_name += (device_mode.dmPelsWidth > 1920) ? "=1.5;" : "=1;"; //设置不同的缩放比例系数
}
scale_name[scale_name.size() - 1] = '\0';
qputenv("QT_SCREEN_SCALE_FACTORS", scale_name.c_str());
//处理图像模糊问题
QGuiApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
//禁止高缩放支持
//QGuiApplication::setAttribute(Qt::AA_DisableHighDpiScaling); //AA_EnableHighDpiScaling
//程序保持默认的尺寸,不缩放
QGuiApplication::setAttribute(Qt::AA_Use96Dpi);
}