大屏分屏控制软件
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

74 lines
2.4 KiB

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'<span style="color:{color};">[{level}] {message}</span>'
self.log_text.append(html_text)
def on_filter_changed(self):
# 这里可以实现重新加载日志的逻辑,或者仅作标记
pass