notepad--高DPI缩放修复:解决模糊问题

【免费下载链接】notepad-- 一个支持windows/linux/mac的文本编辑器,目标是做中国人自己的编辑器,来自中国。 【免费下载链接】notepad-- 项目地址: https://gitcode.com/GitHub_Trending/no/notepad--

现象与痛点

在4K显示器或高分辨率屏幕上使用notepad--时,许多用户反馈界面模糊、文字边缘锯齿严重,尤其在Windows 10/11系统下缩放比例超过100%时问题更为明显。这是由于应用程序未正确启用高DPI(每英寸点数)支持,导致系统对界面元素进行拉伸放大,而非原生渲染。

问题根源分析

通过分析notepad--源代码,发现两个关键问题:

1. Qt高DPI支持未启用

src/main.cpp中存在被注释的高DPI设置代码:

// 发现windows自带方案模糊。//发现下面打开后,在win10上反而效果不好,界面会变得很大,默认还是不开启的好。
//QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
//QApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);

Qt框架提供的AA_EnableHighDpiScaling属性默认未启用,导致界面元素未按系统DPI比例缩放。

2. 缺失应用程序清单(Manifest)配置

RealCompare.rcRealCompareToMinGw.rc资源文件中,均未发现DPI感知配置。Windows系统需要通过Manifest文件识别应用程序的DPI感知能力,缺失此配置会导致系统强制进行位图缩放(Bitmap Scaling),产生模糊效果。

解决方案实施

方案一:启用Qt高DPI支持(推荐)

步骤1:修改主程序入口

编辑src/main.cpp,取消高DPI设置注释并优化配置:

// 在QApplication初始化前添加
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
QApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);
步骤2:验证Qt版本兼容性

确保项目使用Qt 5.6及以上版本(支持高DPI属性),检查src/RealCompare.pro中的Qt配置:

QT += core gui widgets concurrent network xmlpatterns

方案二:添加Windows Manifest配置

步骤1:创建Manifest文件

在项目根目录创建manifest.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <application xmlns="urn:schemas-microsoft-com:asm.v3">
    <windowsSettings>
      <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/pm</dpiAware>
      <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2, PerMonitor</dpiAwareness>
    </windowsSettings>
  </application>
</assembly>
步骤2:关联Manifest到资源文件

编辑src/RealCompareToMinGw.rc,添加Manifest引用:

1 24 "manifest.xml"  // 将Manifest作为24类型资源添加

方案三:配置文件调整(用户级修复)

对于无法重新编译的用户,可通过修改配置文件临时解决:

  1. 定位配置文件:%APPDATA%\notepad\nddsets.ini
  2. 添加DPI配置项:
[General]
high_dpi_scaling=1
dpi_scale_factor=1.5  // 根据显示器缩放比例调整

效果对比

配置方案 清晰度 界面布局 兼容性
默认配置 模糊 元素错位 所有系统
Qt高DPI启用 清晰 布局正常 Qt 5.6+
Manifest配置 清晰 原生渲染 Windows 8.1+
组合方案 最佳 完美适配 全系统支持

实现原理

Qt高DPI渲染流程

mermaid

Windows DPI感知级别

mermaid

注意事项

  1. 版本兼容性

    • Qt 5.6以下版本不支持AA_EnableHighDpiScaling
    • Windows 7及以下不支持Per-Monitor DPI感知
  2. 潜在问题

    • 启用高DPI后部分自定义控件可能需要调整布局
    • 第三方库(如Scintilla)可能需要单独设置DPI支持
  3. 测试建议

    // 调试时添加DPI信息输出
    qDebug() << "DPI Scale Factor:" << qApp->devicePixelRatio();
    qDebug() << "Screen DPI:" << QGuiApplication::primaryScreen()->logicalDotsPerInch();
    

总结与展望

通过启用Qt高DPI支持并添加Manifest配置,可彻底解决notepad--在高分辨率屏幕上的模糊问题。未来版本可考虑:

  1. 添加配置界面DPI缩放选项(nddsetting.cpp中扩展配置项)
  2. 实现自定义缩放比例调整功能
  3. 引入DPI感知的图标资源(多分辨率图标)

用户可通过以下命令获取包含修复的最新代码:

git clone https://gitcode.com/GitHub_Trending/no/notepad--

按照本文步骤修改后,你的notepad--将在任何分辨率下呈现清晰锐利的界面,提升代码编辑体验。

【免费下载链接】notepad-- 一个支持windows/linux/mac的文本编辑器,目标是做中国人自己的编辑器,来自中国。 【免费下载链接】notepad-- 项目地址: https://gitcode.com/GitHub_Trending/no/notepad--

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐