news 2026/4/16 11:01:28

折腾代码编辑器是个技术活,尤其要兼顾灵活性和性能。QScintilla这玩意儿在Qt圈子里算是个隐藏Boss,今天带大伙看看咱魔改的编辑器怎么玩转代码编辑

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
折腾代码编辑器是个技术活,尤其要兼顾灵活性和性能。QScintilla这玩意儿在Qt圈子里算是个隐藏Boss,今天带大伙看看咱魔改的编辑器怎么玩转代码编辑

基于Qt的组件,Qscintilla的代码编辑器。 可有偿提供技术帮助,帮你开发和移植。 支持5种配色方案 本代码自定义的代码编辑器,可应用与任何语言、语法对以下源代码的更新进行说明 [功能] 1.支持自定义快捷键 2.支持自定义皮肤 3.代码高亮:支持自定义高亮规则,关键词等 4.自动补全:支持自动补全列表定义,可添加小图标 5.代码行号显示:根据行号文字大小自动改变栏目宽度,保证完全显示 6.断点调试:左侧栏可显示断点,和运行小图标 7.书签功能:可添加书签 8.支持列选,列修改,多选,多修改 9.支持代码注释,可选多段 10.跳转到指定行 11.文本查找,替换功能 12.支持放大缩小 13.代码折叠 14.可定义指示器 15.添加行和删除行是左侧栏指示颜色 16.提示信息 tooltip 17.翻译 18.加入代码格式化astyle 19.动态添加函数提示

先整点硬核的——自定义语法高亮。咱直接继承QsciLexer搞事情:

class MyLexer : public QsciLexerCustom { public: explicit MyLexer(QObject *parent=0) : QsciLexerCustom(parent) { // 整点骚颜色 setColor(QColor("#FF69B4"), 0); // 基佬紫关键词 } const char *language() const override { return "MyLang"; } QString description(int style) const override { if(style == 0) return "BadAssKeyword"; return QString(); } void styleText(int start, int end) override { // 正则逮住特定模式就上色 QString text = editor_->text(start, end); QRegularExpression rx("\\bfuck\\b"); //...匹配处理 } };

这骚操作能让你把脏话都高亮成基佬紫,适合祖安程序员(手动狗头)。

自动补全得玩出花来。注册个API提供器:

class CompletionProvider(QsciAPIs): def __init__(self, lexer): super().__init__(lexer) self.prepare() # 必须调用 def updateAutoCompletionList(self, context): # 动态添加当前上下文可能的函数 if "numpy" in context: self.add("np.牛逼函数()") self.sort()

配合这个,按Ctrl+Space弹出补全时还能带小图标。实测发现异步加载大词库时得注意线程安全,别整崩了。

调试功能最考验细节处理。断点管理这块儿得自己画侧边栏:

void Editor::paintEvent(QPaintEvent *e) { QsciScintilla::paintEvent(e); QPainter painter(viewport()); // 画断点红圈 foreach (int line, breakpoints) { int y = SendScintilla(SCI_POINTYFROMPOSITION, SendScintilla(SCI_GETLINESELPOSITION, line)); painter.drawEllipse(5, y-5, 10, 10); } }

这里要处理坐标转换,实测在代码折叠时容易翻车,得用SCI方法精确获取位置。

代码折叠是个精细活。配置参数得讲究:

editor.setFolding(QsciScintilla.BoxedTreeFoldStyle) # 盒子式折叠 editor.setFoldMarginColors(QColor("#2E3440"), QColor("#2E3440")) # 暗黑系边栏 editor.SendScintilla(QsciScintilla.SCI_SETPROPERTY, b"fold.compact", b"0") # 展开折叠符号

注意不同语言得配不同折叠策略,像Python这种靠缩进的得用特别处理。

文本操作必须够骚。列编辑模式直接调用:

// 按住Alt拖鼠标进入列选模式 editor.SendScintilla(QsciScintilla.SCI_SETADDITIONALSELECTIONTYPING, true); // 多光标批量修改 QList<QPair<int, int>> selections = { {pos1, pos2}, {pos3, pos4} }; editor.SendScintilla(QsciScintilla.SCI_SETSELECTIONS, selections.size(), selections.data());

这功能实测在处理CSV数据时爽到飞起,建议配个快捷键快速切换模式。

最后说说代码格式化。集成AStyle得注意参数:

QProcess formatter; QStringList args = { "--style=kr", "--indent=spaces=4", "--pad-oper", filePath }; formatter.start("astyle", args); // 捕获输出刷新编辑器

建议做成异步处理,大文件格式化时别卡界面。

(需要技术支持或定制开发可私信,老司机带你飙车)这编辑器在十万行级代码项目里实测流畅,配上自定义的VIM模式键位,妥妥的生产力工具。下回咱们聊聊怎么给它挂上LSP搞语义分析。

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

Rockchip RK3588中断控制器配置:GICv3在arm64系统中的实践

深入RK3588的神经中枢&#xff1a;GICv3中断控制器在arm64系统中的实战解析你有没有遇到过这样的情况——系统跑着跑着&#xff0c;某个CPU突然飙到100%&#xff0c;而其他核心却“无所事事”&#xff1f;或者设备休眠后按了唤醒键毫无反应&#xff0c;只能硬重启&#xff1f;这…

作者头像 李华
网站建设 2026/4/16 10:37:44

Vue3-06 setup() 函数及返回值

vue3的小升级&#xff1a;可以写多个 同名的组件key和val相同&#xff0c;触发简写形式Vue3 中的setup 没有维护 this 这里不是响应式的数据 响应式&#xff1a;&#xff1f;&#xff1f;setup 函数 响应的时机&#xff1a; 在vue2的beforecreate之前执行&#xff0c;下图精简注…

作者头像 李华
网站建设 2026/4/13 17:39:17

2026选产康管理系统,盯紧玄微云这 3 个核心优势准没错

随着“她经济”崛起与健康观念升级&#xff0c;产康行业迎来规模化增长&#xff0c;市场规模年复合增长率稳定在较高水平。与此同时&#xff0c;90后、00后产妇成为消费主力&#xff0c;对服务专业化、流程标准化的需求显著提升&#xff0c;传统人工管理模式已难以适配会员管理…

作者头像 李华