145 lines
4.7 KiB
Python
145 lines
4.7 KiB
Python
#!/usr/bin/env python
|
||
# -*- coding: utf-8 -*-
|
||
"""
|
||
启动加载界面
|
||
显示程序启动和模板加载进度,防止用户误操作
|
||
"""
|
||
from PySide6.QtWidgets import QWidget, QVBoxLayout, QLabel, QProgressBar
|
||
from PySide6.QtCore import Qt, QTimer
|
||
from PySide6.QtGui import QPainter, QColor, QFont
|
||
|
||
|
||
class SplashScreen(QWidget):
|
||
"""半透明启动加载界面"""
|
||
|
||
def __init__(self, parent=None):
|
||
super().__init__(parent)
|
||
self.setWindowFlags(
|
||
Qt.WindowStaysOnTopHint |
|
||
Qt.FramelessWindowHint |
|
||
Qt.Tool
|
||
)
|
||
self.setAttribute(Qt.WA_TranslucentBackground)
|
||
|
||
# 设置窗口大小
|
||
self.setFixedSize(500, 300)
|
||
|
||
# 主布局
|
||
layout = QVBoxLayout()
|
||
layout.setContentsMargins(40, 40, 40, 40)
|
||
layout.setSpacing(20)
|
||
|
||
# 标题
|
||
self.title_label = QLabel("Docx 报告生成器")
|
||
self.title_label.setAlignment(Qt.AlignCenter)
|
||
title_font = QFont()
|
||
title_font.setPointSize(20)
|
||
title_font.setBold(True)
|
||
self.title_label.setFont(title_font)
|
||
self.title_label.setStyleSheet("color: white;")
|
||
|
||
# 状态标签
|
||
self.status_label = QLabel("正在启动...")
|
||
self.status_label.setAlignment(Qt.AlignCenter)
|
||
status_font = QFont()
|
||
status_font.setPointSize(12)
|
||
self.status_label.setFont(status_font)
|
||
self.status_label.setStyleSheet("color: #E0E0E0;")
|
||
|
||
# 进度条
|
||
self.progress_bar = QProgressBar()
|
||
self.progress_bar.setMinimum(0)
|
||
self.progress_bar.setMaximum(100)
|
||
self.progress_bar.setValue(0)
|
||
self.progress_bar.setTextVisible(True)
|
||
self.progress_bar.setStyleSheet("""
|
||
QProgressBar {
|
||
border: 2px solid #555;
|
||
border-radius: 8px;
|
||
background-color: rgba(255, 255, 255, 0.1);
|
||
text-align: center;
|
||
color: white;
|
||
font-size: 11px;
|
||
height: 25px;
|
||
}
|
||
QProgressBar::chunk {
|
||
background-color: qlineargradient(
|
||
x1:0, y1:0, x2:1, y2:0,
|
||
stop:0 #4A90E2,
|
||
stop:1 #357ABD
|
||
);
|
||
border-radius: 6px;
|
||
}
|
||
""")
|
||
|
||
# 详细信息标签
|
||
self.detail_label = QLabel("")
|
||
self.detail_label.setAlignment(Qt.AlignCenter)
|
||
detail_font = QFont()
|
||
detail_font.setPointSize(9)
|
||
self.detail_label.setFont(detail_font)
|
||
self.detail_label.setStyleSheet("color: #B0B0B0;")
|
||
self.detail_label.setWordWrap(True)
|
||
|
||
# 添加到布局
|
||
layout.addStretch(1)
|
||
layout.addWidget(self.title_label)
|
||
layout.addSpacing(10)
|
||
layout.addWidget(self.status_label)
|
||
layout.addWidget(self.progress_bar)
|
||
layout.addWidget(self.detail_label)
|
||
layout.addStretch(1)
|
||
|
||
self.setLayout(layout)
|
||
|
||
# 居中显示
|
||
self._center_on_screen()
|
||
|
||
def _center_on_screen(self):
|
||
"""将窗口居中显示"""
|
||
from PySide6.QtWidgets import QApplication
|
||
screen = QApplication.primaryScreen().geometry()
|
||
x = (screen.width() - self.width()) // 2
|
||
y = (screen.height() - self.height()) // 2
|
||
self.move(x, y)
|
||
|
||
def paintEvent(self, event):
|
||
"""绘制半透明背景"""
|
||
painter = QPainter(self)
|
||
try:
|
||
painter.setRenderHint(QPainter.Antialiasing)
|
||
|
||
# 绘制圆角矩形背景
|
||
painter.setBrush(QColor(40, 40, 40, 230)) # 深灰色,90%不透明
|
||
painter.setPen(QColor(80, 80, 80, 255))
|
||
painter.drawRoundedRect(0, 0, self.width(), self.height(), 15, 15)
|
||
finally:
|
||
painter.end() # 确保 painter 正确结束
|
||
|
||
def update_status(self, message: str, progress: int = None, detail: str = ""):
|
||
"""
|
||
更新加载状态
|
||
|
||
Args:
|
||
message: 主要状态信息
|
||
progress: 进度值 (0-100),None表示不更新
|
||
detail: 详细信息
|
||
"""
|
||
self.status_label.setText(message)
|
||
if progress is not None:
|
||
self.progress_bar.setValue(progress)
|
||
if detail:
|
||
self.detail_label.setText(detail)
|
||
|
||
# 强制刷新界面
|
||
QApplication.processEvents()
|
||
|
||
def finish(self):
|
||
"""完成加载,关闭启动界面"""
|
||
self.update_status("加载完成", 100)
|
||
QTimer.singleShot(300, self.close) # 延迟300ms后关闭
|
||
|
||
|
||
# 导入QApplication以便在update_status中使用
|
||
from PySide6.QtWidgets import QApplication
|