133 lines
4.7 KiB
Python
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() |