209 lines
7.9 KiB
Python
209 lines
7.9 KiB
Python
|
|
#!/usr/bin/env python3
|
|||
|
|
# -*- coding: utf-8 -*-
|
|||
|
|
|
|||
|
|
"""
|
|||
|
|
主窗口类,包含导航和主内容区域
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
import sys
|
|||
|
|
import os
|
|||
|
|
from PyQt5.QtWidgets import (QMainWindow, QWidget, QVBoxLayout, QHBoxLayout,
|
|||
|
|
QPushButton, QStackedWidget, QLabel, QStatusBar, QSizePolicy, QMessageBox, QApplication)
|
|||
|
|
from PyQt5.QtCore import Qt, pyqtSignal
|
|||
|
|
from PyQt5.QtGui import QIcon, QCloseEvent
|
|||
|
|
|
|||
|
|
from views.test_monitor_view import TestMonitorView
|
|||
|
|
from views.test_plan_view import TestPlanView
|
|||
|
|
from views.test_result_view import TestResultView
|
|||
|
|
from views.system_settings_view import SystemSettingsView
|
|||
|
|
|
|||
|
|
class MainWindow(QMainWindow):
|
|||
|
|
# 定义窗口关闭信号
|
|||
|
|
window_closed = pyqtSignal()
|
|||
|
|
|
|||
|
|
def __init__(self):
|
|||
|
|
print("开始初始化主窗口...")
|
|||
|
|
super().__init__()
|
|||
|
|
print("设置窗口标题和尺寸...")
|
|||
|
|
self.setWindowTitle("DTM试验管理系统")
|
|||
|
|
|
|||
|
|
# 设置初始窗口大小(屏幕的90%)
|
|||
|
|
from PyQt5.QtWidgets import QDesktopWidget
|
|||
|
|
screen = QDesktopWidget().screenGeometry()
|
|||
|
|
self.resize(int(screen.width() * 0.9), int(screen.height() * 0.9))
|
|||
|
|
# 窗口居中
|
|||
|
|
self.move((screen.width() - self.width()) // 2, (screen.height() - self.height()) // 2)
|
|||
|
|
|
|||
|
|
# 创建中心部件
|
|||
|
|
print("创建中心部件...")
|
|||
|
|
self.central_widget = QWidget()
|
|||
|
|
self.setCentralWidget(self.central_widget)
|
|||
|
|
|
|||
|
|
# 创建主布局
|
|||
|
|
print("创建主布局...")
|
|||
|
|
self.main_layout = QVBoxLayout(self.central_widget)
|
|||
|
|
self.main_layout.setContentsMargins(0, 0, 0, 0)
|
|||
|
|
self.main_layout.setSpacing(0)
|
|||
|
|
|
|||
|
|
# 创建导航栏
|
|||
|
|
print("创建导航栏...")
|
|||
|
|
self.create_navigation_bar()
|
|||
|
|
|
|||
|
|
# 创建主内容区域
|
|||
|
|
print("创建主内容区域...")
|
|||
|
|
self.create_main_content()
|
|||
|
|
|
|||
|
|
# 创建状态栏
|
|||
|
|
print("创建状态栏...")
|
|||
|
|
self.create_status_bar()
|
|||
|
|
|
|||
|
|
# 应用样式表
|
|||
|
|
print("应用样式表...")
|
|||
|
|
self.apply_styles()
|
|||
|
|
|
|||
|
|
# 默认显示第一个视图
|
|||
|
|
print("切换到默认视图...")
|
|||
|
|
self.switch_to_view(0)
|
|||
|
|
|
|||
|
|
# 窗口初始化完成后设置为最大化显示
|
|||
|
|
self.showMaximized()
|
|||
|
|
print("主窗口初始化完成")
|
|||
|
|
|
|||
|
|
def create_navigation_bar(self):
|
|||
|
|
"""创建导航栏"""
|
|||
|
|
print("创建导航栏部件...")
|
|||
|
|
self.nav_bar = QWidget()
|
|||
|
|
self.nav_bar.setObjectName("nav-bar")
|
|||
|
|
nav_layout = QHBoxLayout(self.nav_bar)
|
|||
|
|
nav_layout.setContentsMargins(10, 10, 10, 10)
|
|||
|
|
nav_layout.setSpacing(20)
|
|||
|
|
|
|||
|
|
# 应用标题
|
|||
|
|
title_label = QLabel("跌落系统管理")
|
|||
|
|
title_label.setObjectName("title")
|
|||
|
|
title_label.setAlignment(Qt.AlignCenter)
|
|||
|
|
title_label.setStyleSheet("font-size: 24px; font-weight: bold;")
|
|||
|
|
nav_layout.addWidget(title_label)
|
|||
|
|
|
|||
|
|
# 添加弹性空间
|
|||
|
|
nav_layout.addStretch()
|
|||
|
|
|
|||
|
|
# 右侧功能按钮
|
|||
|
|
self.nav_buttons = []
|
|||
|
|
|
|||
|
|
# 试验监测按钮
|
|||
|
|
btn_monitor = QPushButton("🖥 试验监测")
|
|||
|
|
btn_monitor.setObjectName("nav-button")
|
|||
|
|
btn_monitor.setCheckable(True)
|
|||
|
|
btn_monitor.clicked.connect(lambda: self.switch_to_view(0))
|
|||
|
|
nav_layout.addWidget(btn_monitor)
|
|||
|
|
self.nav_buttons.append(btn_monitor)
|
|||
|
|
|
|||
|
|
# 试验计划按钮
|
|||
|
|
btn_plan = QPushButton("📋 试验计划")
|
|||
|
|
btn_plan.setObjectName("nav-button")
|
|||
|
|
btn_plan.setCheckable(True)
|
|||
|
|
btn_plan.clicked.connect(lambda: self.switch_to_view(1))
|
|||
|
|
nav_layout.addWidget(btn_plan)
|
|||
|
|
self.nav_buttons.append(btn_plan)
|
|||
|
|
|
|||
|
|
# 测试结果按钮
|
|||
|
|
btn_result = QPushButton("📊 测试结果")
|
|||
|
|
btn_result.setObjectName("nav-button")
|
|||
|
|
btn_result.setCheckable(True)
|
|||
|
|
btn_result.clicked.connect(lambda: self.switch_to_view(2))
|
|||
|
|
nav_layout.addWidget(btn_result)
|
|||
|
|
self.nav_buttons.append(btn_result)
|
|||
|
|
|
|||
|
|
# 系统设置按钮(齿轮图标)
|
|||
|
|
btn_settings = QPushButton("⚙ 系统设置")
|
|||
|
|
btn_settings.setObjectName("nav-button")
|
|||
|
|
btn_settings.setCheckable(True)
|
|||
|
|
btn_settings.clicked.connect(lambda: self.switch_to_view(3))
|
|||
|
|
nav_layout.addWidget(btn_settings)
|
|||
|
|
self.nav_buttons.append(btn_settings)
|
|||
|
|
|
|||
|
|
# 添加关闭按钮 (取消关闭按钮,复用主窗口的关闭按钮)
|
|||
|
|
# close_button = QPushButton("×")
|
|||
|
|
# close_button.setObjectName("close-button")
|
|||
|
|
# close_button.clicked.connect(self.close_application)
|
|||
|
|
# nav_layout.addWidget(close_button)
|
|||
|
|
|
|||
|
|
self.main_layout.addWidget(self.nav_bar)
|
|||
|
|
print("导航栏创建完成")
|
|||
|
|
|
|||
|
|
def create_main_content(self):
|
|||
|
|
"""创建主内容区域"""
|
|||
|
|
print("创建主内容区域...")
|
|||
|
|
self.content_area = QStackedWidget()
|
|||
|
|
self.main_layout.addWidget(self.content_area)
|
|||
|
|
|
|||
|
|
# 创建各个视图
|
|||
|
|
print("创建试验监控视图...")
|
|||
|
|
self.test_monitor_view = TestMonitorView() # 默认监控界面
|
|||
|
|
print("创建试验计划视图...")
|
|||
|
|
self.test_plan_view = TestPlanView()
|
|||
|
|
print("创建测试结果视图...")
|
|||
|
|
self.test_result_view = TestResultView()
|
|||
|
|
print("创建系统设置视图...")
|
|||
|
|
self.system_settings_view = SystemSettingsView()
|
|||
|
|
|
|||
|
|
# 添加到堆叠窗口
|
|||
|
|
print("添加视图到堆叠窗口...")
|
|||
|
|
self.content_area.addWidget(self.test_monitor_view) # 索引0:试验监控(默认)
|
|||
|
|
self.content_area.addWidget(self.test_plan_view) # 索引1:试验计划
|
|||
|
|
self.content_area.addWidget(self.test_result_view) # 索引2:测试结果
|
|||
|
|
self.content_area.addWidget(self.system_settings_view) # 索引3:系统设置
|
|||
|
|
print("主内容区域创建完成")
|
|||
|
|
|
|||
|
|
def create_status_bar(self):
|
|||
|
|
"""创建状态栏"""
|
|||
|
|
print("创建状态栏...")
|
|||
|
|
self.status_bar = QStatusBar()
|
|||
|
|
self.setStatusBar(self.status_bar)
|
|||
|
|
self.status_bar.showMessage("就绪")
|
|||
|
|
print("状态栏创建完成")
|
|||
|
|
|
|||
|
|
def apply_styles(self):
|
|||
|
|
"""应用样式表"""
|
|||
|
|
try:
|
|||
|
|
style_file = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'styles', 'app_style.qss')
|
|||
|
|
if os.path.exists(style_file):
|
|||
|
|
with open(style_file, 'r', encoding='utf-8') as f:
|
|||
|
|
style_sheet = f.read()
|
|||
|
|
# 全局应用样式,确保按钮等控件样式生效
|
|||
|
|
QApplication.instance().setStyleSheet(style_sheet)
|
|||
|
|
print(f"导入全局样式: {style_file}")
|
|||
|
|
else:
|
|||
|
|
print(f"样式文件未找到: {style_file}")
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"应用样式时出错: {e}")
|
|||
|
|
|
|||
|
|
def close_application(self):
|
|||
|
|
"""关闭应用程序"""
|
|||
|
|
reply = QMessageBox.question(self, "确认退出", "确定要关闭系统吗?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
|
|||
|
|
if reply == QMessageBox.Yes:
|
|||
|
|
self.close()
|
|||
|
|
|
|||
|
|
def closeEvent(self, event: QCloseEvent):
|
|||
|
|
"""重写窗口关闭事件"""
|
|||
|
|
print("主窗口关闭事件触发")
|
|||
|
|
# 发出窗口关闭信号
|
|||
|
|
self.window_closed.emit()
|
|||
|
|
# 接受关闭事件
|
|||
|
|
event.accept()
|
|||
|
|
print("主窗口关闭完成")
|
|||
|
|
|
|||
|
|
def switch_to_view(self, index):
|
|||
|
|
"""切换视图"""
|
|||
|
|
# 更新按钮状态
|
|||
|
|
for i, button in enumerate(self.nav_buttons):
|
|||
|
|
button.setChecked(i == index)
|
|||
|
|
|
|||
|
|
# 切换内容
|
|||
|
|
self.content_area.setCurrentIndex(index)
|
|||
|
|
|
|||
|
|
# 更新状态栏
|
|||
|
|
view_names = ["试验监控", "试验计划", "测试结果", "系统设置"]
|
|||
|
|
if index < len(view_names):
|
|||
|
|
self.status_bar.showMessage(f"当前视图: {view_names[index]}")
|