From 065ec4741807797f2d0ef5ab1d5a00a10b8cb752 Mon Sep 17 00:00:00 2001 From: ZhangTingan Date: Fri, 8 May 2026 15:06:18 +0800 Subject: [PATCH] fix(editor): prevent incorrect scroll position when opening files log: The resizeEvent "keep at bottom" logic triggers when maximum()==value()==0 during widget creation with empty document, causing a deferred setValue(maximum()) to scroll the viewport to the wrong position after content is loaded. Bug: https://pms.uniontech.com/bug-view-358723.html --- src/editor/dtextedit.cpp | 4 +++- src/editor/editwrapper.cpp | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/editor/dtextedit.cpp b/src/editor/dtextedit.cpp index 1ce239b21..6f1ec75d5 100644 --- a/src/editor/dtextedit.cpp +++ b/src/editor/dtextedit.cpp @@ -7547,7 +7547,9 @@ void TextEdit::resizeEvent(QResizeEvent *e) markAllKeywordInView(); // 当前处于文档页面尾部时,缩放后保持焦点在文档页面尾部 - if (e->oldSize().width() < e->size().width() && verticalScrollBar()->maximum() == verticalScrollBar()->value()) { + // maximum() > 0: 排除文档为空或尚未加载的情况(此时 max==val==0 恒成立) + if (e->oldSize().width() < e->size().width() && verticalScrollBar()->maximum() == verticalScrollBar()->value() + && verticalScrollBar()->maximum() > 0) { // 使用 QPointer 检查对象是否还存在 QPointer self(this); QTimer::singleShot(0, [self]() { diff --git a/src/editor/editwrapper.cpp b/src/editor/editwrapper.cpp index 2159e88f8..ea7cd6fc0 100644 --- a/src/editor/editwrapper.cpp +++ b/src/editor/editwrapper.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2017 - 2023 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2017 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later @@ -1312,6 +1312,8 @@ void EditWrapper::loadContent(const QByteArray &strContent) QByteArray text = strContent.mid(InitContentPos, len - InitContentPos); data = codec->toUnicode(text.constData(), text.size(), &state); cursor.insertText(data); + // 第二次insertText会导致Qt内部跟随滚动,需重置视口到文档开头 + m_pTextEdit->verticalScrollBar()->setValue(0); inserted += (len - InitContentPos); progress = (inserted * 1.0) / len * 100; m_pBottomBar->setProgress(static_cast(progress));