From 4f5fd0eeaa41d318bbcd0ae0aa7dd588b716c42f Mon Sep 17 00:00:00 2001 From: liyepan Date: Thu, 22 Oct 2026 19:07:01 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20v0.10.6=20=E2=80=94=E2=80=94=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E4=BB=A3=E7=A0=81=E6=A1=86/=E8=A1=A8=E6=A0=BC?= =?UTF-8?q?=E4=B9=8B=E5=90=8E=E5=86=85=E5=AE=B9=E8=A2=AB=E5=90=9E=E8=BF=9B?= =?UTF-8?q?=E5=8E=BB=E5=AF=BC=E8=87=B4=E5=AF=BC=E5=87=BA=E5=8D=A1=E6=AD=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因 - 插入 QTextFrame(代码块)或 QTextTable(表格)之后,光标被设到 frame->lastPosition()——这个位置仍然在框内部,于是后续所有内容 都被插进了这个框/单元格里,一层层嵌套 - 复杂文档(有多张表、多个代码块)嵌套后文档高度从 1.3 万爆到 12 万, 分页时几乎算不完,表现就是点导出直接卡住 修复 - 定位到 lastPosition() + 1(框外的位置)再继续写 - 实测同一份 11KB 报告:修复前文档高度 120137、导出超时; 修复后 13664、14 页 A4,1 秒内完成 顺带 - 之前版本里代码块/表格后面的内容排版其实也是错的(被塞进框里), 这次一并修正 - 版本 0.10.6 --- VoiletMark.pro | 2 +- src/MarkdownRenderer.cpp | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/VoiletMark.pro b/VoiletMark.pro index 4c8f0d4..6a88d0c 100644 --- a/VoiletMark.pro +++ b/VoiletMark.pro @@ -1,6 +1,6 @@ TEMPLATE = app TARGET = VoiletMark -VERSION = 0.10.5 +VERSION = 0.10.6 QT += core gui widgets diff --git a/src/MarkdownRenderer.cpp b/src/MarkdownRenderer.cpp index 42e2e8f..917f10b 100644 --- a/src/MarkdownRenderer.cpp +++ b/src/MarkdownRenderer.cpp @@ -276,9 +276,10 @@ void Renderer::renderCodeBlock(const QStringList &lines, const QString &info) frameCursor.insertText(QStringLiteral(" "), format); } - // 光标挪到边框外面,后面的内容接着写 + // 光标挪到边框外面:lastPosition() 还在框内,+1 才是框后面的位置, + // 否则后续内容会一层层嵌进这个框里,排版高度爆掉、导出时卡死。 m_cursor = QTextCursor(m_document); - m_cursor.setPosition(frame->lastPosition()); + m_cursor.setPosition(qMin(frame->lastPosition() + 1, m_document->characterCount() - 1)); } QColor Renderer::tokenColor(CodeHighlight::Token token) const @@ -373,8 +374,9 @@ void Renderer::renderTable(const QStringList &rows, const QString &separator) } } + // 同样要跨过表格边界,否则后面的内容会塞进最后一个单元格 m_cursor = QTextCursor(m_document); - m_cursor.setPosition(table->lastPosition()); + m_cursor.setPosition(qMin(table->lastPosition() + 1, m_document->characterCount() - 1)); } void Renderer::renderRule()