Files
dtm-py-all/UI/views/main_window.py

209 lines
7.9 KiB
Python
Raw Permalink Normal View History

#!/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]}")