zhuizhu 7 ay önce
ebeveyn
işleme
6a4f406d22
2 değiştirilmiş dosya ile 58 ekleme ve 2 silme
  1. 57 2
      MainPanel.cpp
  2. 1 0
      MainPanel.h

+ 57 - 2
MainPanel.cpp

@@ -480,8 +480,12 @@ void MainPanel::setPlayerWidget(QWidget *newPlayer)
 
             showChatEmbedded();
             if (m_chatButton) m_chatButton->setText(tr("聊天"));
+            applyModeLayout(); // 恢复布局为非推流状态
         });
     }
+
+    // 根据当前模式(录制/播放)应用一次自适应布局
+    applyModeLayout();
 }
 
 void MainPanel::handleDebouncedPlay()
@@ -705,8 +709,12 @@ void MainPanel::onChatWindowCloseRequested()
 {
     // 如果处在推流状态,认为是“隐藏聊天”而不是关闭程序
     if (m_isStreaming) {
+        // 显式隐藏独立聊天窗口,统一行为到 eventFilter 的隐藏逻辑
+        if (m_chatFrame && m_chatFrame->isVisible()) {
+            m_chatFrame->hide();
+        }
         if (m_chatButton) m_chatButton->setText(tr("显示聊天"));
-        return; // ChatWindow本身会隐藏
+        return; // ChatWindow 本身不要销毁
     }
 
     // 非推流:回归嵌入显示
@@ -789,10 +797,57 @@ void MainPanel::hideFloatingToolbar()
         m_compactFrame->hide();
 }
 
+// 新增:根据模式与窗口大小自适应布局
+void MainPanel::applyModeLayout()
+{
+    // 若控件未初始化,直接返回
+    if (!splitter || !playerContainer) return;
+
+    // 推流期间,主窗口处于隐藏/极简状态,这里只保证分割区域隐藏
+    if (m_isStreaming) {
+        if (m_rightWidget) m_rightWidget->hide();
+        splitter->hide();
+        return;
+    }
+
+    const bool isRecorder = qobject_cast<RecorderWidget*>(playerWidget) != nullptr;
+    const bool isPlayer   = qobject_cast<AVPlayerWidget*>(playerWidget) != nullptr;
+
+    // 保证分割窗口可见,用于布局
+    splitter->show();
+
+    const int panelW = width() > 0 ? width() : 1200;
+
+    if (isPlayer) {
+        // 播放模式:默认折叠右侧,让视频获得更大可视区域
+        if (m_rightWidget) m_rightWidget->hide();
+
+        // 如果聊天仍处于嵌入容器,将其弹出为独立窗口,避免占位
+        if (chatView && m_chatContainer && chatView->parent() == m_chatContainer) {
+            showChatStandalone();
+        }
+        // 左侧铺满
+        QList<int> sizes; sizes << panelW << 0;
+        splitter->setSizes(sizes);
+        return;
+    }
+
+    // 录制模式(非推流):展示右侧面板并保持聊天嵌入,宽度自适应为总宽的 1/3(300~420 间)
+    if (m_rightWidget) m_rightWidget->show();
+    showChatEmbedded();
+
+    int chatW = panelW / 3;
+    chatW = qBound(300, chatW, 420);
+    const int leftW = qMax(0, panelW - chatW);
+    QList<int> sizes; sizes << leftW << chatW;
+    splitter->setSizes(sizes);
+}
+
 void MainPanel::resizeEvent(QResizeEvent* event)
 {
     QWidget::resizeEvent(event);
-    // 主窗口 Resize 不再需要移动悬浮条
+    // 随窗口大小调整左右比例
+    applyModeLayout();
 }
 
 bool MainPanel::eventFilter(QObject *watched, QEvent *event)

+ 1 - 0
MainPanel.h

@@ -64,6 +64,7 @@ private:
     // 新增:推流时浮动工具栏控制
     void showFloatingToolbar();
     void hideFloatingToolbar();
+    void applyModeLayout(); // 新增:根据模式与窗口大小自适应布局
 
 protected:
     void resizeEvent(QResizeEvent* event) override;