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_())