|
|
@@ -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)
|