from PyQt5.QtWidgets import (QTextEdit, QPushButton, QHBoxLayout, QVBoxLayout, QWidget, QGroupBox, QComboBox, QLabel) from PyQt5.QtCore import pyqtSlot from utils.logger import logger class LogPanel(QWidget): def __init__(self): super().__init__() self.init_ui() # 注册到全局日志器 logger.add_listener(self.append_text) def init_ui(self): # 设置分组框,界面更好看 group_box = QGroupBox("运行日志") layout = QVBoxLayout() # 1. 日志显示区域 self.log_text = QTextEdit() self.log_text.setReadOnly(True) # 只读 self.log_text.setStyleSheet("QTextEdit { background-color: #f0f0f0; font-family: Consolas; }") # 2. 控制栏 ctrl_layout = QHBoxLayout() # 日志级别过滤(可选功能) self.level_combo = QComboBox() self.level_combo.addItems(["所有", "INFO", "DEBUG", "WARNING", "ERROR"]) self.level_combo.currentTextChanged.connect(self.on_filter_changed) # 清空按钮 clear_btn = QPushButton("清空") clear_btn.clicked.connect(self.log_text.clear) # 将占用空间大的控件放中间,按钮靠右 ctrl_layout.addWidget(QLabel("过滤:")) ctrl_layout.addWidget(self.level_combo) ctrl_layout.addStretch() ctrl_layout.addWidget(clear_btn) layout.addLayout(ctrl_layout) layout.addWidget(self.log_text) group_box.setLayout(layout) main_layout = QVBoxLayout() main_layout.addWidget(group_box) self.setLayout(main_layout) @pyqtSlot(str, str) def append_text(self, message, level): """ 接收日志并显示。 这里可以做颜色区分 """ # 简单的过滤逻辑 if self.level_combo.currentText() != "所有" and level != self.level_combo.currentText(): return # 根据级别设置颜色 color_map = { "INFO": "blue", "DEBUG": "gray", "WARNING": "orange", "ERROR": "red" } color = color_map.get(level, "black") html_text = f'[{level}] {message}' self.log_text.append(html_text) def on_filter_changed(self): # 这里可以实现重新加载日志的逻辑,或者仅作标记 pass