onekeydiag/src/main.py

196 lines
8.2 KiB
Python
Raw Normal View History

2025-08-21 18:19:04 +08:00
import sys
import os
from PyQt5.QtWidgets import (QApplication, QMainWindow, QFileDialog, QTextBrowser,
QMessageBox, QTextEdit, QGraphicsScene, QGraphicsPixmapItem)
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPixmap
from PyQt5.QtGui import QPainter # 单独导入QPainter用于抗锯齿设置
from MainWindow_ui import Ui_MainWindow # 导入转换后的UI类
import service
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__() # 初始化父类
self.setupUi(self) # 调用UI类的方法初始化界面
self.init_events() # 绑定事件(自定义方法)
self.parseStatus = service.ServiceStatus()
self.init_graphic_views()
self.init_textbrowser_style()
self.comboBoxTextDict = {
"ALL_Temp": "all",
"CPU_Temp": "cpu",
"FPGA_Temp": "fpga",
"DIMM_Temp": "dimm",
"Inlet_CPU_Temp": "inlet_cpu",
"Inlet_FPGA_Temp": "inlet_fpga",
"M2_Temp": "m2",
"Outlet_CPU_Temp": "outlet_cpu",
"Outlet_FPGA_Temp": "outlet_fpga",
"VR_CPU_Temp": "vr_cpu",
"VR_FPGA_Temp": "vr_fpga"
}
def init_textbrowser_style(self):
# 设置样式表(全局文本样式)
self.textBrowser_info.setStyleSheet("""
QTextBrowser {
font-family: 'SimHei';
font-size: 14px;
color: #2c3e50;
background-color: #f8f9fa;
border: 1px solid #ddd;
border-radius: 4px;
padding: 8px;
}
""")
def init_events(self):
"""绑定界面元素的事件(如按钮点击、输入框变化等)"""
# 示例:给按钮添加点击事件
# self.pushButton.clicked.connect(self.on_button_click) # pushButton是UI中定义的按钮对象名
# 绑定上传菜单项事件
self.actionUpload_log.triggered.connect(self.upload_file)
self.comboBox.currentTextChanged.connect(self.on_combo_changed)
def init_graphic_views(self):
# 初始化图形场景和视图
self.scene = QGraphicsScene(self) # 创建场景
self.graphicsView.setScene(self.scene) # 将场景绑定到视图
self.graphicsView.setRenderHint(QPainter.Antialiasing) # 抗锯齿
self.graphicsView.setRenderHint(QPainter.SmoothPixmapTransform) # 平滑缩放
# 初始化图形场景和视图
# self.scene_temp_cpu = QGraphicsScene(self) # 创建场景
# self.graphicsView_temp_cpu.setScene(self.scene_temp_cpu) # 将场景绑定到视图
# self.graphicsView_temp_cpu.setRenderHint(QPainter.Antialiasing) # 抗锯齿
# self.graphicsView_temp_cpu.setRenderHint(QPainter.SmoothPixmapTransform) # 平滑缩放
# 存储当前显示的图片项
self.pixmap_item = None
self.current_image_path = None
def upload_file(self):
"""打开文件选择对话框并处理选中的文件"""
# 打开文件选择对话框
# 参数说明:
# - self父窗口
# - "选择文件":对话框标题
# - os.getcwd():默认打开路径(当前工作目录)
# - "所有文件 (*);;文本文件 (*.txt);;图片文件 (*.png *.jpg)":文件筛选器
file_path, file_type = QFileDialog.getOpenFileName(
self,
"选择文件",
os.getcwd(),
"所有文件 (*);;日志压缩文件 (*.gz)"
)
# 判断用户是否选择了文件取消选择时file_path为空
if file_path:
self.process_uploaded_file(file_path)
# else:
# self.text_edit.append("已取消文件选择")
def process_uploaded_file(self, file_path):
"""处理上传的文件(这里仅展示文件信息,可根据需求扩展)"""
try:
# 获取文件信息
file_name = os.path.basename(file_path)
file_size = os.path.getsize(file_path)
file_size_kb = file_size / 1024 # 转换为KB
# 显示文件信息
info = f"已上传文件:\n"
info += f"文件名:{file_name}\n"
info += f"路径:{file_path}\n"
info += f"大小:{file_size_kb:.2f} KB\n"
info += "-" * 50 + "\n"
self.textBrowser_console.insertPlainText(info)
# 这里可以添加实际的文件处理逻辑:
service.send_log_to_cache(file_path)
service.start_diagnose(self.parseStatus)
if self.parseStatus.baseinfo_status:
baseinfo_str = service.get_baseinfo_str()
self.textBrowser_info.insertPlainText(baseinfo_str)
if self.parseStatus.sensorhistory_status:
self.display_pic(service.get_sensorhistory_path("all"))
self.textBrowser_console.insertPlainText("完成文件解析\n")
except Exception as e:
QMessageBox.critical(self, "处理失败", f"文件处理出错:{str(e)}")
def on_combo_changed(self, selected_text):
"""下拉列表选项变化时切换图片"""
self.display_pic(service.get_sensorhistory_path(self.comboBoxTextDict[selected_text]))
def display_pic(self, image_path):
"""在QGraphicsView中显示图片"""
try:
# 清空场景中已有的内容
self.scene.clear()
# 加载图片并创建图形项
pixmap = QPixmap(image_path)
if pixmap.isNull():
raise Exception("无法加载图片文件")
# 创建图片项并添加到场景
self.pixmap_item = QGraphicsPixmapItem(pixmap)
self.scene.addItem(self.pixmap_item)
# 初始显示时让图片居中
self.graphicsView.fitInView(self.scene.sceneRect(), Qt.KeepAspectRatio)
except Exception as e:
QMessageBox.critical(self, "错误", f"显示图片失败:{str(e)}")
def zoom_with_mouse_wheel(self, event):
"""鼠标滚轮缩放图片"""
if self.pixmap_item: # 只有存在图片时才允许缩放
# 获取当前鼠标位置作为缩放中心
mouse_pos = event.pos()
scene_pos = self.graphicsView.mapToScene(mouse_pos)
# 缩放因子(滚轮向前放大,向后缩小)
scale_factor = 1.1 if event.angleDelta().y() > 0 else 0.9
# 缩放视图
self.graphicsView.scale(scale_factor, scale_factor)
# 缩放后将鼠标位置保持在原场景位置(避免缩放时画面跳动)
new_mouse_pos = self.graphicsView.mapFromScene(scene_pos)
delta = new_mouse_pos - mouse_pos
self.graphicsView.horizontalScrollBar().setValue(
self.graphicsView.horizontalScrollBar().value() - delta.x()
)
self.graphicsView.verticalScrollBar().setValue(
self.graphicsView.verticalScrollBar().value() - delta.y()
)
else:
# 若无图片,忽略滚轮事件
super(type(self.graphicsView), self.graphicsView).wheelEvent(event)
def resizeEvent(self, event):
"""窗口大小改变时,自适应调整图片显示"""
if self.pixmap_item and not self.graphicsView.transform().isIdentity():
# 仅在未手动缩放时自动适应窗口
self.graphicsView.fitInView(self.scene.sceneRect(), Qt.KeepAspectRatio)
super().resizeEvent(event)
if __name__ == "__main__":
service.app_cache_init()
# 创建应用实例
app = QApplication(sys.argv)
# 创建主窗口并显示
window = MainWindow()
window.show()
# 进入应用主循环
sys.exit(app.exec_())