# logger_config.py import logging from PySide6.QtWidgets import QTextEdit from PySide6.QtCore import Signal, QObject class QTextEditLogger(logging.Handler, QObject): """ 自定义的 logging 处理器,将日志消息发送到 QTextEdit 控件。 """ # 定义一个信号,用于在 GUI 线程中更新 QTextEdit append_text = Signal(str) def __init__(self, widget: QTextEdit): super().__init__() QObject.__init__(self) # 初始化 QObject 部分 self.widget = widget self.widget.setReadOnly(True) # 确保日志区域是只读的 # 连接信号到 QTextEdit 的 append 方法 self.append_text.connect(self.widget.append) def emit(self, record): """ 处理日志记录,将其格式化并通过信号发送到 QTextEdit。 """ msg = self.format(record) self.append_text.emit(msg) def setup_logging(text_edit_widget: QTextEdit): """ 配置全局 logging,使其输出到控制台和指定的 QTextEdit 控件。 """ root_logger = logging.getLogger() # 设置日志级别,可以根据需要调整 (DEBUG, INFO, WARNING, ERROR, CRITICAL) root_logger.setLevel(logging.DEBUG) # 清除现有的处理器,防止重复输出(如果多次调用此函数) for handler in root_logger.handlers[:]: root_logger.removeHandler(handler) # 1. 控制台处理器 (可选,用于调试) console_handler = logging.StreamHandler() formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') console_handler.setFormatter(formatter) root_logger.addHandler(console_handler) # 2. QTextEdit 处理器 text_edit_handler = QTextEditLogger(text_edit_widget) text_edit_handler.setFormatter(formatter) root_logger.addHandler(text_edit_handler) return root_logger # 获取一个全局的 logger 实例,方便其他模块使用 logger = logging.getLogger(__name__)