Files
leonpan-pc/app/view/widgets/welcome_video.py
2025-11-02 19:17:20 +08:00

133 lines
4.7 KiB
Python

# coding:utf-8
import os
import sys
from PyQt6.QtCore import Qt, QUrl, QTimer
from PyQt6.QtGui import QIcon
from PyQt6.QtWidgets import QApplication, QHBoxLayout, QLabel, QPushButton, QVBoxLayout, QWidget
from PyQt6.QtMultimedia import QMediaPlayer, QVideoSink, QAudioOutput
from PyQt6.QtMultimediaWidgets import QVideoWidget
from loguru import logger
from app.core.utils.config import cfg
class WelcomeVideoPlayer(QWidget):
"""欢迎视频播放器,用于首次运行时播放介绍视频"""
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowFlags(Qt.WindowType.FramelessWindowHint | Qt.WindowType.WindowStaysOnTopHint)
self.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground)
# 设置视频播放器组件
self.media_player = QMediaPlayer()
# 创建视频窗口
self.video_widget = QVideoWidget()
# 使用正确的属性赋值方式
self.media_player.setVideoOutput(self.video_widget)
# 创建跳过按钮
self.skip_button = QPushButton("跳过")
self.skip_button.setFixedSize(100, 40)
self.skip_button.setObjectName("skipButton")
self.skip_button.setStyleSheet("""
QPushButton {
background-color: rgba(255, 255, 255, 0.3);
color: white;
border-radius: 20px;
font-size: 14px;
font-weight: bold;
}
QPushButton:hover {
background-color: rgba(255, 255, 255, 0.5);
}
QPushButton:pressed {
background-color: rgba(255, 255, 255, 0.7);
}
""")
self.skip_button.clicked.connect(self.skip_video)
# 设置布局
self.main_layout = QVBoxLayout(self)
self.main_layout.setContentsMargins(0, 0, 0, 0)
self.main_layout.addWidget(self.video_widget)
# 创建跳过按钮布局
self.skip_layout = QHBoxLayout()
self.skip_layout.addStretch()
self.skip_layout.addWidget(self.skip_button)
self.skip_layout.setContentsMargins(0, 0, 20, 20)
# 将跳过按钮布局添加到主布局
self.main_layout.addLayout(self.skip_layout)
self.main_layout.setAlignment(self.skip_layout, Qt.AlignmentFlag.AlignBottom)
# 连接信号
self.media_player.playbackStateChanged.connect(self.on_playback_state_changed)
self.media_player.errorOccurred.connect(self.on_error)
# 设置视频文件路径
self.video_path = os.path.join("_internal", "start.mp4")
def play(self):
"""播放视频"""
if os.path.exists(self.video_path):
logger.info(f"开始播放欢迎视频: {self.video_path}")
# 设置视频源
self.media_player.setSource(QUrl.fromLocalFile(self.video_path))
# 调整窗口大小以适应屏幕
self.adjust_window_size()
# 显示窗口
self.show()
# 开始播放
self.media_player.play()
else:
logger.warning(f"欢迎视频文件不存在: {self.video_path}")
self.close()
def skip_video(self):
"""跳过视频"""
logger.info("用户点击跳过按钮,停止播放欢迎视频")
self.stop_and_close()
def stop_and_close(self):
"""停止播放并关闭窗口"""
self.media_player.stop()
# 标记为非首次运行
cfg.firstRun.value = False
# 延迟关闭,确保配置保存
QTimer.singleShot(100, self.close)
def on_playback_state_changed(self, state):
"""处理播放状态变化"""
from PyQt6.QtMultimedia import QMediaPlayer
if state == QMediaPlayer.PlaybackState.StoppedState:
logger.info("欢迎视频播放完成")
self.stop_and_close()
def on_error(self, error, error_string):
"""处理播放器错误"""
logger.error(f"视频播放错误: {error_string}")
self.stop_and_close()
def adjust_window_size(self):
"""调整窗口大小以适应屏幕"""
# 获取屏幕大小
screen = QApplication.primaryScreen().availableGeometry()
# 设置窗口大小为屏幕的90%
width = int(screen.width() * 0.9)
height = int(screen.height() * 0.9)
self.resize(width, height)
# 居中显示
self.move(screen.center().x() - width // 2, screen.center().y() - height // 2)
def closeEvent(self, event):
"""关闭事件"""
self.media_player.stop()
event.accept()