From b4c2dd5d8519f704f87d28027f3093af5860f550 Mon Sep 17 00:00:00 2001 From: Da Shen Date: Mon, 1 Jun 2026 18:17:18 +0800 Subject: [PATCH 1/7] =?UTF-8?q?[0185]=20=E6=9B=B4=E6=96=B0=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.7 --- devel/0185.md | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 devel/0185.md diff --git a/devel/0185.md b/devel/0185.md new file mode 100644 index 0000000000..a58c43f85d --- /dev/null +++ b/devel/0185.md @@ -0,0 +1,112 @@ +# [0185] Chat 侧边栏欢迎内容居中偏上调整 + +## 相关文档 + +- [dddd.md](dddd.md) - 任务文档模板 + +## 任务相关的代码文件 + +- `src/Plugins/Qt/qt_chat_tab_widget.cpp` +- `src/Plugins/Qt/qt_chat_tab_widget.hpp` +- `tests/Plugins/Qt/qt_chat_tab_widget_test.cpp` + +## 如何测试 + +### 确定性测试(单元测试) + +编译并运行 Chat Tab Widget 单元测试: + +```bash +xmake b qt_chat_tab_widget_test +xmake r qt_chat_tab_widget_test +``` + +预期结果:全部通过。 + +### 非确定性测试(UI 验证) + +#### A. Chat 标签页欢迎页位置 + +1. 切换到 Chat 标签页(确保没有活跃会话,显示欢迎页) +2. 观察:"欢迎使用 Liii STEM" 和输入框应位于整个软件界面的竖直方向中心稍稍偏上 +3. 调整窗口高度(放大/缩小) +4. 观察:欢迎内容应随窗口高度自适应,始终保持中心偏上 + +#### B. Chat 侧边栏(dock 模式)欢迎页位置 + +1. 打开一个 TMU 文档或 PDF 文档 +2. 点击右上角 AI 对话浮动按钮,打开右侧 dock +3. 确保 dock 中显示的是欢迎页(无活跃会话或新建空白会话) +4. 观察:"欢迎使用 Liii STEM" 和输入框应位于整个软件界面的竖直方向中心稍稍偏上 +5. 调整主窗口高度 +6. 观察:欢迎内容应随窗口高度自适应,始终保持中心偏上 + +#### C. 会话模式不受影响 + +1. 在 Chat 标签页或 dock 中发送一条消息 +2. 观察:消息区域应贴顶显示(仅有少量顶部偏移),输入框在底部 +3. 观察:不应出现大片空白区域挤压消息区 + +## 如何提交 + +提交前编译项目: + +```bash +xmake b stem +``` + +提交前运行单元测试: + +```bash +xmake b qt_chat_tab_widget_test +xmake r qt_chat_tab_widget_test +``` + +## What + +调整 `ChatConversationPanel` 欢迎模式的竖直布局策略,使其在 Chat 标签页和 Chat 侧边栏(dock)模式下都能将"欢迎使用 Liii STEM"和输入框置于整个软件界面的中心偏上位置。 + +具体修改: +1. 将 `contentLayout` 顶部固定偏移(240px)改为 0,消除硬编码偏移。 +2. 在 `topPanel` 内部添加顶部和底部弹性空间(`QSpacerItem`,stretch 比例 2:1),利用 Qt 布局的自适应能力将内容推到中心偏上。 +3. 进入会话模式时,将内部弹性空间收缩为 0,避免挤压消息区域。 + +## Why + +当前实现使用固定的 240px 顶部 spacer(`kWelcomeTopOffsetY`): +- 在 Chat 标签页模式下,由于标签页容器高度相对较小,240px 偏移使内容看起来偏上。 +- 在 Chat 侧边栏(dock)模式下,dock 高度通常等于主窗口高度,240px 偏移不足以将内容推到偏上位置,导致内容落在 dock 的竖直方向中心,与 Chat 标签页的视觉效果不一致。 + +用户期望两种模式下的欢迎页具有统一的视觉位置:整个软件界面的中心稍稍偏上。 + +## How + +### 布局策略调整 + +原方案: +``` +contentLayout: [topSpacer_ 240px Fixed] -> [topPanel stretch 1, AlignTop] +``` + +新方案(欢迎模式): +``` +contentLayout: [topSpacer_ 0px Fixed] -> [topPanel stretch 1, AlignTop] +topLayout: [topInnerSpacer_ Expanding stretch 2] + -> [welcomeTitle_] + -> [sessionTitle_] + -> [messageFrame_ hidden] + -> [inputWrap] + -> [bottomInnerSpacer_ Expanding stretch 1] +``` + +新方案(会话模式): +``` +contentLayout: [topSpacer_ 8px Fixed] -> [topPanel stretch 1, AlignTop] +topLayout: [topInnerSpacer_ 0px Fixed] + -> [sessionTitle_] + -> [messageFrame_ stretch 1 visible] + -> [inputWrap] + -> [bottomInnerSpacer_ 0px Fixed] +``` + +`topInnerSpacer_` 和 `bottomInnerSpacer_` 在欢迎模式下为 `Expanding`,stretch 比例 2:1,使内容中心位于面板高度的 1/3 处(中心偏上)。进入会话模式后,二者收缩为 `Fixed(0,0)`,不影响消息区域展开。 From 0fa10042bbad3a47e7dd33962a4808344b9b101b Mon Sep 17 00:00:00 2001 From: Da Shen Date: Mon, 1 Jun 2026 18:17:23 +0800 Subject: [PATCH 2/7] =?UTF-8?q?[0185]=20Chat=20=E4=BE=A7=E8=BE=B9=E6=A0=8F?= =?UTF-8?q?=E6=AC=A2=E8=BF=8E=E5=86=85=E5=AE=B9=E5=B1=85=E4=B8=AD=E5=81=8F?= =?UTF-8?q?=E4=B8=8A=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 contentLayout 顶部固定偏移(240px)改为 0,消除硬编码偏移。 - 在 topPanel 内部添加顶部和底部弹性空间(QSpacerItem,stretch 比例 2:1), 利用 Qt 布局自适应能力将欢迎内容推到中心偏上。 - 进入会话模式时,将内部弹性空间收缩为 0,避免挤压消息区域。 Co-Authored-By: Claude Opus 4.7 --- src/Plugins/Qt/qt_chat_tab_widget.cpp | 36 +++++++++++++++++--- src/Plugins/Qt/qt_chat_tab_widget.hpp | 2 ++ tests/Plugins/Qt/qt_chat_tab_widget_test.cpp | 2 ++ 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/src/Plugins/Qt/qt_chat_tab_widget.cpp b/src/Plugins/Qt/qt_chat_tab_widget.cpp index 5b94e30fa8..82a463aae8 100644 --- a/src/Plugins/Qt/qt_chat_tab_widget.cpp +++ b/src/Plugins/Qt/qt_chat_tab_widget.cpp @@ -137,8 +137,7 @@ ChatConversationPanel::setup_ui () { contentLayout->setContentsMargins (0, DpiUtils::scaled (kContentMarginY), 0, DpiUtils::scaled (kContentMarginY)); contentLayout->setSpacing (DpiUtils::scaled (kContentSpacing)); - topSpacer_= new QSpacerItem (0, DpiUtils::scaled (kWelcomeTopOffsetY), - QSizePolicy::Minimum, QSizePolicy::Fixed); + topSpacer_= new QSpacerItem (0, 0, QSizePolicy::Minimum, QSizePolicy::Fixed); contentLayout->addSpacerItem (topSpacer_); QWidget* topPanel = new QWidget (this); @@ -146,6 +145,13 @@ ChatConversationPanel::setup_ui () { topLayout->setContentsMargins (0, 0, 0, 0); topLayout->setSpacing (DpiUtils::scaled (kContentSpacing)); + // 顶部弹性空间(欢迎模式下将内容推到中心偏上) + topInnerSpacer_= new QSpacerItem (0, 0, QSizePolicy::Minimum, + QSizePolicy::Expanding); + int topInnerIdx= topLayout->count (); + topLayout->addSpacerItem (topInnerSpacer_); + topLayout->setStretch (topInnerIdx, 2); + // Welcome title welcomeTitle_= new QLabel (qt_translate ("Welcome to Liii STEM!"), topPanel); welcomeTitle_->setObjectName ("chat-tab-welcome-title"); @@ -308,6 +314,13 @@ ChatConversationPanel::setup_ui () { inputWrap->addStretch (1); topLayout->addLayout (inputWrap, 0); + // 底部弹性空间(欢迎模式下与顶部弹性空间配合,将内容推到中心偏上) + bottomInnerSpacer_= new QSpacerItem (0, 0, QSizePolicy::Minimum, + QSizePolicy::Expanding); + int bottomInnerIdx= topLayout->count (); + topLayout->addSpacerItem (bottomInnerSpacer_); + topLayout->setStretch (bottomInnerIdx, 1); + contentLayout->addWidget (topPanel, 1, Qt::AlignTop); } @@ -315,9 +328,8 @@ void ChatConversationPanel::enterConversationMode () { if (conversationMode_) return; - conversationMode_ = true; - const int startOffset= DpiUtils::scaled (kWelcomeTopOffsetY); - const int endOffset = DpiUtils::scaled (kConversationTopOffsetY); + conversationMode_ = true; + const int endOffset= DpiUtils::scaled (kConversationTopOffsetY); if (messageFrame_) { QGraphicsOpacityEffect* messageEffect= @@ -357,6 +369,20 @@ ChatConversationPanel::enterConversationMode () { layout ()->invalidate (); layout ()->activate (); } + + if (topInnerSpacer_) { + topInnerSpacer_->changeSize (0, 0, QSizePolicy::Minimum, + QSizePolicy::Fixed); + } + if (bottomInnerSpacer_) { + bottomInnerSpacer_->changeSize (0, 0, QSizePolicy::Minimum, + QSizePolicy::Fixed); + } + if (welcomeTitle_ && welcomeTitle_->parentWidget () && + welcomeTitle_->parentWidget ()->layout ()) { + welcomeTitle_->parentWidget ()->layout ()->invalidate (); + welcomeTitle_->parentWidget ()->layout ()->activate (); + } } void diff --git a/src/Plugins/Qt/qt_chat_tab_widget.hpp b/src/Plugins/Qt/qt_chat_tab_widget.hpp index 0533a71307..f2baaad66f 100644 --- a/src/Plugins/Qt/qt_chat_tab_widget.hpp +++ b/src/Plugins/Qt/qt_chat_tab_widget.hpp @@ -133,6 +133,8 @@ class ChatConversationPanel : public QWidget { QPushButton* sendButton_ = nullptr; ///< 发送/停止按钮 QToolButton* thinkingButton_ = nullptr; ///< 推理模式开关 QSpacerItem* topSpacer_ = nullptr; ///< 欢迎页顶部弹性空间 + QSpacerItem* topInnerSpacer_ = nullptr; ///< topPanel 内顶部弹性空间 + QSpacerItem* bottomInnerSpacer_= nullptr; ///< topPanel 内底部弹性空间 widget messageWidget_; ///< 消息区 TeXmacs widget widget inputWidget; ///< 输入区 TeXmacs widget int fixedFrameExtra_ = 0; ///< 输入框额外高度(边框等) diff --git a/tests/Plugins/Qt/qt_chat_tab_widget_test.cpp b/tests/Plugins/Qt/qt_chat_tab_widget_test.cpp index c7443eebce..d09c122d92 100644 --- a/tests/Plugins/Qt/qt_chat_tab_widget_test.cpp +++ b/tests/Plugins/Qt/qt_chat_tab_widget_test.cpp @@ -8,6 +8,7 @@ #include "Qt/qt_chat_tab_widget.hpp" #include "Qt/qt_utilities.hpp" #include "base.hpp" +#include #include #include #include @@ -15,6 +16,7 @@ #include #include #include +#include #include using namespace moebius; From d931d04b7446d1e3c6e77f81fee42dcece141d42 Mon Sep 17 00:00:00 2001 From: Da Shen Date: Mon, 1 Jun 2026 18:24:19 +0800 Subject: [PATCH 3/7] =?UTF-8?q?[0185]=20=E8=B0=83=E6=95=B4=E6=AC=A2?= =?UTF-8?q?=E8=BF=8E=E9=A1=B5=E5=86=85=E5=AE=B9=E4=BD=8D=E7=BD=AE=E5=88=B0?= =?UTF-8?q?=202/5=20=E5=A4=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 topInnerSpacer_ 的 size hint 从 0 改为 120px,确保小窗口下也有足够顶部偏移。 - 将 inner spacer stretch 比例从 2:1 调整为 1:1,使内容更稳定在 2/5 位置。 Co-Authored-By: Claude Opus 4.7 --- src/Plugins/Qt/qt_chat_tab_widget.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Plugins/Qt/qt_chat_tab_widget.cpp b/src/Plugins/Qt/qt_chat_tab_widget.cpp index 82a463aae8..215a1df8ba 100644 --- a/src/Plugins/Qt/qt_chat_tab_widget.cpp +++ b/src/Plugins/Qt/qt_chat_tab_widget.cpp @@ -146,11 +146,12 @@ ChatConversationPanel::setup_ui () { topLayout->setSpacing (DpiUtils::scaled (kContentSpacing)); // 顶部弹性空间(欢迎模式下将内容推到中心偏上) - topInnerSpacer_= new QSpacerItem (0, 0, QSizePolicy::Minimum, + topInnerSpacer_= new QSpacerItem (0, DpiUtils::scaled (120), + QSizePolicy::Minimum, QSizePolicy::Expanding); int topInnerIdx= topLayout->count (); topLayout->addSpacerItem (topInnerSpacer_); - topLayout->setStretch (topInnerIdx, 2); + topLayout->setStretch (topInnerIdx, 1); // Welcome title welcomeTitle_= new QLabel (qt_translate ("Welcome to Liii STEM!"), topPanel); From f445dfc42f63b3fe62c13283f3d16259068a8241 Mon Sep 17 00:00:00 2001 From: Da Shen Date: Mon, 1 Jun 2026 18:29:51 +0800 Subject: [PATCH 4/7] =?UTF-8?q?[0185]=20=E6=AC=A2=E8=BF=8E=E9=A1=B5?= =?UTF-8?q?=E5=86=85=E5=AE=B9=E6=8C=89=E5=AE=B9=E5=99=A8=E9=AB=98=E5=BA=A6?= =?UTF-8?q?=E6=AF=94=E4=BE=8B=E5=AE=9A=E4=BD=8D=E5=88=B0=202/5=20=E5=A4=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除 topPanel 内部的固定/弹性混合 spacer 方案。 - 改为在 resizeEvent 中根据 ChatConversationPanel 当前高度动态计算 topSpacer_ 的固定偏移:height * 2/5 - marginY。 - 确保在不同窗口高度下,欢迎内容始终稳定在容器高度的 2/5 处。 - 进入会话模式时 topSpacer_ 恢复为 8px,不影响消息区域展开。 Co-Authored-By: Claude Opus 4.7 --- src/Plugins/Qt/qt_chat_tab_widget.cpp | 39 +++++++++------------------ src/Plugins/Qt/qt_chat_tab_widget.hpp | 4 +-- 2 files changed, 14 insertions(+), 29 deletions(-) diff --git a/src/Plugins/Qt/qt_chat_tab_widget.cpp b/src/Plugins/Qt/qt_chat_tab_widget.cpp index 215a1df8ba..202ae91536 100644 --- a/src/Plugins/Qt/qt_chat_tab_widget.cpp +++ b/src/Plugins/Qt/qt_chat_tab_widget.cpp @@ -145,14 +145,6 @@ ChatConversationPanel::setup_ui () { topLayout->setContentsMargins (0, 0, 0, 0); topLayout->setSpacing (DpiUtils::scaled (kContentSpacing)); - // 顶部弹性空间(欢迎模式下将内容推到中心偏上) - topInnerSpacer_= new QSpacerItem (0, DpiUtils::scaled (120), - QSizePolicy::Minimum, - QSizePolicy::Expanding); - int topInnerIdx= topLayout->count (); - topLayout->addSpacerItem (topInnerSpacer_); - topLayout->setStretch (topInnerIdx, 1); - // Welcome title welcomeTitle_= new QLabel (qt_translate ("Welcome to Liii STEM!"), topPanel); welcomeTitle_->setObjectName ("chat-tab-welcome-title"); @@ -315,13 +307,6 @@ ChatConversationPanel::setup_ui () { inputWrap->addStretch (1); topLayout->addLayout (inputWrap, 0); - // 底部弹性空间(欢迎模式下与顶部弹性空间配合,将内容推到中心偏上) - bottomInnerSpacer_= new QSpacerItem (0, 0, QSizePolicy::Minimum, - QSizePolicy::Expanding); - int bottomInnerIdx= topLayout->count (); - topLayout->addSpacerItem (bottomInnerSpacer_); - topLayout->setStretch (bottomInnerIdx, 1); - contentLayout->addWidget (topPanel, 1, Qt::AlignTop); } @@ -370,19 +355,19 @@ ChatConversationPanel::enterConversationMode () { layout ()->invalidate (); layout ()->activate (); } +} - if (topInnerSpacer_) { - topInnerSpacer_->changeSize (0, 0, QSizePolicy::Minimum, - QSizePolicy::Fixed); - } - if (bottomInnerSpacer_) { - bottomInnerSpacer_->changeSize (0, 0, QSizePolicy::Minimum, - QSizePolicy::Fixed); - } - if (welcomeTitle_ && welcomeTitle_->parentWidget () && - welcomeTitle_->parentWidget ()->layout ()) { - welcomeTitle_->parentWidget ()->layout ()->invalidate (); - welcomeTitle_->parentWidget ()->layout ()->activate (); +void +ChatConversationPanel::resizeEvent (QResizeEvent* event) { + QWidget::resizeEvent (event); + if (conversationMode_ || !topSpacer_) return; + int targetOffset= height () * 2 / 5 - DpiUtils::scaled (kContentMarginY); + if (targetOffset < 0) targetOffset= 0; + topSpacer_->changeSize (0, targetOffset, QSizePolicy::Minimum, + QSizePolicy::Fixed); + if (layout ()) { + layout ()->invalidate (); + layout ()->activate (); } } diff --git a/src/Plugins/Qt/qt_chat_tab_widget.hpp b/src/Plugins/Qt/qt_chat_tab_widget.hpp index f2baaad66f..ba142870b7 100644 --- a/src/Plugins/Qt/qt_chat_tab_widget.hpp +++ b/src/Plugins/Qt/qt_chat_tab_widget.hpp @@ -114,6 +114,8 @@ class ChatConversationPanel : public QWidget { protected: /// 事件过滤器:拦截 Enter 键触发发送 bool eventFilter (QObject* watched, QEvent* event) override; + /// 欢迎模式下按容器高度比例调整顶部偏移 + void resizeEvent (QResizeEvent* event) override; private: /// 构建面板 UI 布局 @@ -133,8 +135,6 @@ class ChatConversationPanel : public QWidget { QPushButton* sendButton_ = nullptr; ///< 发送/停止按钮 QToolButton* thinkingButton_ = nullptr; ///< 推理模式开关 QSpacerItem* topSpacer_ = nullptr; ///< 欢迎页顶部弹性空间 - QSpacerItem* topInnerSpacer_ = nullptr; ///< topPanel 内顶部弹性空间 - QSpacerItem* bottomInnerSpacer_= nullptr; ///< topPanel 内底部弹性空间 widget messageWidget_; ///< 消息区 TeXmacs widget widget inputWidget; ///< 输入区 TeXmacs widget int fixedFrameExtra_ = 0; ///< 输入框额外高度(边框等) From 677afe194b378d41221d5880188cca358c6a04c5 Mon Sep 17 00:00:00 2001 From: Da Shen Date: Mon, 1 Jun 2026 18:35:38 +0800 Subject: [PATCH 5/7] =?UTF-8?q?[0185]=20=E8=B0=83=E6=95=B4=20Chat=20?= =?UTF-8?q?=E6=AC=A2=E8=BF=8E=E9=A1=B5=E4=BD=8D=E7=BD=AE=E4=B8=BA=E5=AE=B9?= =?UTF-8?q?=E5=99=A8=E9=AB=98=E5=BA=A6=E7=9A=84=202/7=20=E5=A4=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将 resizeEvent 中计算顶部偏移的比例从 2/5 调整为 2/7, 使欢迎内容在 Chat 标签页和 dock 侧边栏模式下 都位于容器中心稍稍偏上的位置。 Co-Authored-By: Claude Opus 4.7 --- src/Plugins/Qt/qt_chat_tab_widget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Plugins/Qt/qt_chat_tab_widget.cpp b/src/Plugins/Qt/qt_chat_tab_widget.cpp index 202ae91536..4fd08bb47c 100644 --- a/src/Plugins/Qt/qt_chat_tab_widget.cpp +++ b/src/Plugins/Qt/qt_chat_tab_widget.cpp @@ -361,7 +361,7 @@ void ChatConversationPanel::resizeEvent (QResizeEvent* event) { QWidget::resizeEvent (event); if (conversationMode_ || !topSpacer_) return; - int targetOffset= height () * 2 / 5 - DpiUtils::scaled (kContentMarginY); + int targetOffset= height () * 2 / 7 - DpiUtils::scaled (kContentMarginY); if (targetOffset < 0) targetOffset= 0; topSpacer_->changeSize (0, targetOffset, QSizePolicy::Minimum, QSizePolicy::Fixed); From ad8d883c3463980ff550e98740e2560dc0b5faf2 Mon Sep 17 00:00:00 2001 From: Da Shen Date: Mon, 1 Jun 2026 18:38:09 +0800 Subject: [PATCH 6/7] =?UTF-8?q?[0185]=20=E6=9B=B4=E6=96=B0=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.7 --- devel/0185.md | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/devel/0185.md b/devel/0185.md index a58c43f85d..8123abdf06 100644 --- a/devel/0185.md +++ b/devel/0185.md @@ -68,8 +68,8 @@ xmake r qt_chat_tab_widget_test 具体修改: 1. 将 `contentLayout` 顶部固定偏移(240px)改为 0,消除硬编码偏移。 -2. 在 `topPanel` 内部添加顶部和底部弹性空间(`QSpacerItem`,stretch 比例 2:1),利用 Qt 布局的自适应能力将内容推到中心偏上。 -3. 进入会话模式时,将内部弹性空间收缩为 0,避免挤压消息区域。 +2. 重写 `ChatConversationPanel::resizeEvent()`,在欢迎模式下根据面板高度动态计算顶部 spacer 高度,使内容位于容器高度的 2/7 处(中心稍稍偏上)。 +3. 进入会话模式时,顶部 spacer 恢复为固定小偏移(8px),不影响消息区域展开。 ## Why @@ -90,23 +90,19 @@ contentLayout: [topSpacer_ 240px Fixed] -> [topPanel stretch 1, AlignTop] 新方案(欢迎模式): ``` -contentLayout: [topSpacer_ 0px Fixed] -> [topPanel stretch 1, AlignTop] -topLayout: [topInnerSpacer_ Expanding stretch 2] - -> [welcomeTitle_] +contentLayout: [topSpacer_ height*2/7 Fixed] -> [topPanel stretch 1, AlignTop] +topLayout: [welcomeTitle_] -> [sessionTitle_] -> [messageFrame_ hidden] -> [inputWrap] - -> [bottomInnerSpacer_ Expanding stretch 1] ``` 新方案(会话模式): ``` contentLayout: [topSpacer_ 8px Fixed] -> [topPanel stretch 1, AlignTop] -topLayout: [topInnerSpacer_ 0px Fixed] - -> [sessionTitle_] +topLayout: [sessionTitle_] -> [messageFrame_ stretch 1 visible] -> [inputWrap] - -> [bottomInnerSpacer_ 0px Fixed] ``` -`topInnerSpacer_` 和 `bottomInnerSpacer_` 在欢迎模式下为 `Expanding`,stretch 比例 2:1,使内容中心位于面板高度的 1/3 处(中心偏上)。进入会话模式后,二者收缩为 `Fixed(0,0)`,不影响消息区域展开。 +`resizeEvent` 中按 `height() * 2 / 7 - kContentMarginY` 计算顶部 spacer 高度,确保内容始终位于容器高度的 2/7 处(中心稍稍偏上)。窗口大小变化时自动重新计算,无需内部弹性空间。进入会话模式后,`topSpacer_` 收缩为固定小偏移,不影响消息区域展开。 From 96e68d5dc39d97e44e8185930ae512dbee4052c2 Mon Sep 17 00:00:00 2001 From: Da Shen Date: Mon, 1 Jun 2026 18:42:36 +0800 Subject: [PATCH 7/7] wip --- src/Plugins/Qt/qt_chat_tab_widget.cpp | 2 +- tests/Plugins/Qt/qt_chat_tab_widget_test.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Plugins/Qt/qt_chat_tab_widget.cpp b/src/Plugins/Qt/qt_chat_tab_widget.cpp index 4fd08bb47c..3148eb859c 100644 --- a/src/Plugins/Qt/qt_chat_tab_widget.cpp +++ b/src/Plugins/Qt/qt_chat_tab_widget.cpp @@ -364,7 +364,7 @@ ChatConversationPanel::resizeEvent (QResizeEvent* event) { int targetOffset= height () * 2 / 7 - DpiUtils::scaled (kContentMarginY); if (targetOffset < 0) targetOffset= 0; topSpacer_->changeSize (0, targetOffset, QSizePolicy::Minimum, - QSizePolicy::Fixed); + QSizePolicy::Fixed); if (layout ()) { layout ()->invalidate (); layout ()->activate (); diff --git a/tests/Plugins/Qt/qt_chat_tab_widget_test.cpp b/tests/Plugins/Qt/qt_chat_tab_widget_test.cpp index d09c122d92..db0b8e7228 100644 --- a/tests/Plugins/Qt/qt_chat_tab_widget_test.cpp +++ b/tests/Plugins/Qt/qt_chat_tab_widget_test.cpp @@ -8,8 +8,8 @@ #include "Qt/qt_chat_tab_widget.hpp" #include "Qt/qt_utilities.hpp" #include "base.hpp" -#include #include +#include #include #include #include