news 2026/9/17 21:55:32

notepad-- 深度拆解:Qt5 与 QScintilla 如何实现跨平台文本编辑与文件对比

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
notepad-- 深度拆解:Qt5 与 QScintilla 如何实现跨平台文本编辑与文件对比

notepad-- 深度拆解:Qt5 与 QScintilla 如何实现跨平台文本编辑与文件对比

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

在 macOS 上打开 GBK 文件满屏乱码、2G 日志根本打不开的那一刻,你才懂跨平台文本编辑器意味着什么。notepad--(Ndd)是一个基于 C++/Qt5 的文本编辑器,面向 Windows、macOS、Linux 和 UOS,内置语法高亮、编码自动识别与文件对比。

📦 项目速览:功能与技术实现对照

notepad-- 的定位是"哪都能跑的中国编辑器":一套 C++ 代码在三大平台编译,额外提供插件机制和四十多种语言高亮,重点照顾国产 UOS 等信创环境。

功能技术实现用户获益
语法高亮QScintilla 编辑内核(仓库内置源码)打开即高亮四十多种语言
编码处理自研 DetectEncode 检测GBK/Big5/UTF-16 打开不乱码
文件对比分块对比 + LCS 算法跨目录差异一眼看清
大文件分块只读 + tailf 跟随数 GB 日志可滚动、可追新

![跨平台文本编辑器 mac 版主界面与目录列表面板](https://raw.gitcode.com/GitHub_Trending/no/notepad--/raw/4510896f716e71db9f4b25ed8559b9c39a4f23d4/pngshow/macos/2023-10-05 18.04.17.png?utm_source=gitcode_repo_files)

🔁 一次打开文件的数据旅程

从双击到文件可编辑,数据流可以拆成五步。应用启动时 src/main.cpp 先做单实例检查:Windows 用共享内存ccnotepad记录窗口句柄,Linux 在notepad--共享内存里存 PID,macOS 依赖系统 QFileOpenEvent 机制。若已有实例,新进程把文件路径通过 WM_COPYDATA(Windows)或 SIGUSR1 信号(Linux)交给旧窗口后直接退出——这就是"右键打开复用已有窗口"的体验来源。

真正首实例时进入CCNotePad::openFile():先按文件后缀匹配语法,再让 src/scintillaeditview.cpp 把文本交给 Scintilla 引擎完成渲染与高亮;对比场景下则由 src/CmpareMode.h 的scanFileRealCode()采样前 200 行判定编码。打开后主窗口的QFileSystemWatcher持续监控,文件被外部修改可自动重载或 tailf 跟随。

拖放/双击文件 └─> main.cpp 单实例检查(共享内存 + IPC) └─> CCNotePad::openFile() ├─> autoSetDocLexer() 按后缀匹配语法 ├─> scanFileRealCode() 检测编码 └─> ScintillaEditView 加载渲染 └─> QFileSystemWatcher 持续监控

Windows 版还支持"目录批量查找"模式:对整棵目录树搜索关键词,底部结果面板列出全部命中,双击跳转对应行,数据流与单文件一致。

🏗️ 架构分层拆解:一个 Qt 单体应用如何组织

桌面单体应用没有前后端之分,但职责清晰分三层:

编辑内核层:QScintilla。它是 Scintilla 引擎(Notepad++ 同款内核)的 Qt 封装。仓库没有引用系统库,而是把完整源码放在 src/qscint/,包含引擎核心、四十多种语言 lexer、甚至 Boost.Regex。为什么内置?核心体验不能跟随系统依赖版本漂移,源码在手,发现 bug 可直接改。关键入口 src/scintillaeditview.h:继承 QsciScintilla,包了列模式编辑、书签、行排序、markdown 预览。

主窗口层:CCNotePad。src/cceditor/ccnotepad.cpp 是全项目最大的 9900 行文件,管标签页、拖拽、自动保存、会话恢复、皮肤切换。构建入口 CMakeLists.txt 只依赖内置 qscint 与 Qt5 六个模块;打包走 CPack,Windows 用 NSIS(cmake/nsis_package_config.cmake),Linux 出 deb 包。

功能模块层:横向扩展。对比是 src/CmpareMode.cpp + src/StrategyCompare.h;编码转换是 src/Encode.h;插件在 src/plugin/,仓库内附可编译的 helloworld 示例,主程序与插件经 src/nddpluginapi.h 定义的 C 风格 API 通信。

⚖️ 设计决策拆解:单实例、大文件与配置存储

1. 跨平台单实例 = 三种 IPC 各写一套。同一个需求——"开文件复用已有窗口"——Windows 用句柄 + WM_COPYDATA,Linux 用 PID + 信号,macOS 交给系统。三套代码的成本,换来零守护进程、毫秒级启动。

2. 大文件四种打开模式。src/cceditor/ccnotepad.h 的NddDocType枚举区分文本、二进制、大文本只读、超大文本只读。大文本按块读取,只在m_addrLineNumMap里缓存块首尾行号,4G 级日志也能滚动。代价是放弃编辑——对日志场景,这是合理取舍。

3. 配置从 JSON 退回 INI。更新日志明确写了 1.18 版"内部使用 ini 配置替换 json 格式"以加速启动,由 src/nddsetting.cpp 经 QSettings 统一管理。编辑器最高频动作是"打开",每次省一点解析时间比加功能更划算。

🎬 三个真实场景:UOS 迁移、超大日志与文件对比

信创/UOS 迁移。痛点:Windows 上用的编辑器到了 UOS 直接打不开,看代码要换两套软件。方案:notepad-- 同一套代码编译到 UOS,#ifdef uos下还专门适配了字体。效果:习惯、快捷键、配置原样搬过去。

超大日志排查。痛点:2G 在线日志,普通记事本提示文件过大,只能回终端 grep。方案:超大文本模式打开 + tailf 跟随。效果:滚动定位的同时实时看新日志行,行号定位问题现场。

两人改动做差异。痛点:同一份脚本两人各改一版,肉眼逐行比对像在抄经。方案:内置文件/目录对比,两侧各自自动探测编码,避免"一边 GBK 一边 UTF-8 满屏假差异"。效果:差异分块对齐高亮,二进制对比上限由MAX_BIN_SIZE约束在 10MB 内。

🔧 工程细节:并发、内存与崩溃恢复

  • 并发:对比任务走 QtConcurrent/QFuture,大目录对比不冻 UI
  • 内存:大文件按块读取,只缓存块首尾行号
  • 崩溃恢复:崩溃后下次打开无条件保存新旧文件(1.18 版起)
  • 搜索性能:查找结果对超长行截断,防止结果框卡死
  • 文件监控:QFileSystemWatcher + tailf 线程实现自动重载

📚 值得翻的源码:理解项目的 4 个文件

  • src/main.cpp:471 行读完三平台 IPC 与单实例检查全貌
  • src/cceditor/ccnotepad.cpp:主窗口如何管理标签页全生命周期
  • src/scintillaeditview.cpp:Scintilla C 接口如何包装成 Qt 信号槽
  • src/CmpareMode.cpp:编码检测 + 分块对比,差异功能的核心

总结

  • ✅ 一套代码三平台编译
  • ✅ 四十多语言开箱高亮
  • ✅ 混合编码自动识别转换
  • ✅ 大日志分块打开加 tailf
  • ✅ 内置文件与目录对比

如果你正好需要一个 UOS 上能用的编辑器,或者想看"内核源码直接搬进仓库"的 Qt 应用长什么样,可以克隆 https://gitcode.com/GitHub_Trending/no/notepad-- ,用 CMake 构建一遍,答案都在源码里。

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

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/17 21:50:03

Open Agents环境变量管理:如何快速用 vc env pull 搞定多环境配置

Open Agents环境变量管理:如何快速用 vc env pull 搞定多环境配置 【免费下载链接】open-agents An open source template for building cloud agents. 项目地址: https://gitcode.com/GitHub_Trending/op/open-agents Open Agents 是一个构建云端 AI 编程 A…

作者头像 李华
网站建设 2026/9/17 21:49:55

IAR Cp001授权校验失败排查:License Manager与主机标识

上周帮隔壁组同事收拾一台新装的开发机,IAR 装完之后双击图标,界面还没出来就弹了个框:Error[Cp001]: Copy protection check。他第一反应是安装包坏了,删了重装三遍,问题原封不动。这类 IAR 安装报错其实特别常见&…

作者头像 李华