大屏分屏控制软件
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

3 months ago
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