| 
						 
							
							
							
						 
					 | 
				
			
			 | 
			 | 
			
				@@ -1,10 +1,11 @@
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				from PySide6.QtWidgets import QWidget, QLabel, QMessageBox, QVBoxLayout, QTreeWidget, QHeaderView, QHBoxLayout, QPushButton, QFrame, QLineEdit, QCheckBox, QTreeWidgetItem, QDialog, QPlainTextEdit, QApplication
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				from PySide6.QtCore import Qt, Signal
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				from PySide6.QtGui import QColor, QIcon, QFont, QKeySequence, QIntValidator, QShortcut
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				from PySide6.QtCore import Qt, Signal, QSize
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				from PySide6.QtGui import QColor, QIcon, QKeySequence, QIntValidator, QShortcut
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				from codes.common.signal_bus import signal_bus
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				from codes.common import db_operation
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				from codes.common import clibs
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				from codes.common.qss_reloader import qss_reloader
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				class LogDialog(QDialog):
 | 
			
		
		
	
	
		
			
				
					
					| 
						
					 | 
				
			
			 | 
			 | 
			
				@@ -52,7 +53,6 @@ class PageNumberInput(QDialog):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.le_page_number = QLineEdit(self)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.le_page_number.setText("1")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.le_page_number.selectAll()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.le_page_number.setFont(QFont('Consolas', 14))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.le_page_number.setValidator(QIntValidator(0, 9999999, self))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        layout_h.addWidget(self.le_page_number, stretch=4)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        layout_h.addStretch(1)
 | 
			
		
		
	
	
		
			
				
					
					| 
						
					 | 
				
			
			 | 
			 | 
			
				@@ -75,71 +75,89 @@ class ClickableLabel(QLabel):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				class W08Log(QWidget):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    def __init__(self, parent=None):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        super().__init__(parent)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.predos()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.pre_do()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.ui_init()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.setup_slot()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.setup_sc()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.post_do()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    def predos(self):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    def pre_do(self):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.records, self.len_records = "", ""
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.is_searching = False
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.max_item_number = clibs.config["log_number_per_page"]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    def ui_init(self):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.setObjectName("W08Log")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        layout_v = QVBoxLayout(self)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.treeW = QTreeWidget()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.treeW.setUniformRowHeights(True)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.treeW.setObjectName("treeW")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.treeW.setHeaderLabels(["ID", "时间戳", "告警级别", "模块信息", "告警内容"])
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        header = self.treeW.header()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.treeW.headerItem().setTextAlignment(0, Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.header = self.treeW.header()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.header.setObjectName("header")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        for i in range(self.treeW.columnCount()):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            header.setSectionResizeMode(i, QHeaderView.ResizeMode.ResizeToContents)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            self.header.setSectionResizeMode(i, QHeaderView.ResizeMode.ResizeToContents)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        layout_v.addWidget(self.treeW, stretch=9)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        layout_h = QHBoxLayout()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.pb_previous = QPushButton("上一页")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.pb_previous.setObjectName("pb_previous")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        layout_h.addWidget(self.pb_previous, stretch=1)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.lb_page = ClickableLabel("999999/999999")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.lb_page.setObjectName("lb_page")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.lb_page.setAlignment(Qt.AlignmentFlag.AlignCenter)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.lb_page.setMinimumWidth(144)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        layout_h.addWidget(self.lb_page, stretch=2)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.pb_next = QPushButton("下一页")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.pb_next.setObjectName("pb_next")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        layout_h.addWidget(self.pb_next, stretch=1)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        layout_h.addStretch(9)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.frame_checkbox = QFrame()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.frame_checkbox.setObjectName("frame_checkbox")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        layout_h_checkbox = QHBoxLayout()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.box_info = QCheckBox("通知", parent=self.frame_checkbox)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.box_info.setObjectName("box_info")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.box_info.setChecked(True)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        layout_h_checkbox.addWidget(self.box_info, stretch=1)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.box_warning = QCheckBox("告警", parent=self.frame_checkbox)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.box_warning.setObjectName("box_warning")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.box_warning.setChecked(True)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        layout_h_checkbox.addWidget(self.box_warning, stretch=1)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.box_error = QCheckBox("错误", parent=self.frame_checkbox)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.box_error.setObjectName("box_error")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.box_error.setChecked(True)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        layout_h_checkbox.addWidget(self.box_error, stretch=1)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.box_exception = QCheckBox("异常", parent=self.frame_checkbox)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.box_exception.setObjectName("box_exception")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.box_exception.setChecked(True)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        layout_h_checkbox.addWidget(self.box_exception, stretch=1)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.box_unknown = QCheckBox("未知", parent=self.frame_checkbox)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.box_unknown.setObjectName("box_unknown")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.box_unknown.setChecked(True)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        layout_h_checkbox.addWidget(self.box_unknown, stretch=1)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        layout_h.addLayout(layout_h_checkbox, stretch=4)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.le_search = QLineEdit()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.le_search.setObjectName("le_search")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.le_search.setPlaceholderText("告警内容")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.le_search.setMinimumWidth(300)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        layout_h.addWidget(self.le_search, stretch=5)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.pb_search = QPushButton("查找")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.pb_search.setObjectName("pb_search")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        layout_h.addWidget(self.pb_search, stretch=1)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        layout_v.addLayout(layout_h, stretch=1)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.setLayout(layout_v)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    def post_do(self):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        qss_reloader.register(clibs.qss_w08_log, self)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.setup_slot()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.setup_sc()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    def setup_slot(self):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.treeW.itemDoubleClicked.connect(self.show_single_log)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.pb_previous.clicked.connect(self.previous_page)
 | 
			
		
		
	
	
		
			
				
					
					| 
						
					 | 
				
			
			 | 
			 | 
			
				@@ -154,14 +172,14 @@ class W08Log(QWidget):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    def previous_page(self):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        if not self.is_searching:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            self.records, self.len_records = db_operation.db_query_logs(True)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            self.records, self.len_records = db_operation.db_query_logs(None)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        current, total = self.lb_page.text().split("/")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        page_number = int(current) - 1
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.show_page(self.records, self.len_records, page_number=page_number)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    def next_page(self):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        if not self.is_searching:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            self.records, self.len_records = db_operation.db_query_logs(True)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            self.records, self.len_records = db_operation.db_query_logs(None)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        current, total = self.lb_page.text().split("/")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        page_number = int(current) + 1
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.show_page(self.records, self.len_records, page_number=page_number)
 | 
			
		
		
	
	
		
			
				
					
					| 
						
					 | 
				
			
			 | 
			 | 
			
				@@ -180,7 +198,7 @@ class W08Log(QWidget):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            QMessageBox().warning(None, "警告", "至少选择一个过滤器!")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            return
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.records, self.len_records = db_operation.db_query_logs(levels=levels)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.records, self.len_records = db_operation.db_query_logs(levels)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        if search_text:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            self.records, self.len_records = db_operation.db_query_logs(search_text, self.records)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
	
		
			
				
					
					| 
						
					 | 
				
			
			 | 
			 | 
			
				@@ -194,11 +212,11 @@ class W08Log(QWidget):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        page_number = dlg.get_page_number()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        if not self.is_searching:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            self.records, self.len_records = db_operation.db_query_logs(True)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            self.records, self.len_records = db_operation.db_query_logs(None)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.show_page(self.records, self.len_records, page_number=page_number)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    def show_latest_page(self):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.records, self.len_records = db_operation.db_query_logs(True)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.records, self.len_records = db_operation.db_query_logs(None)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.is_searching = False
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.box_info.setChecked(True)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.box_warning.setChecked(True)
 | 
			
		
		
	
	
		
			
				
					
					| 
						
					 | 
				
			
			 | 
			 | 
			
				@@ -237,15 +255,23 @@ class W08Log(QWidget):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            idx_end = self.max_item_number * current
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.treeW.clear()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.treeW.setUniformRowHeights(True)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        for record in records[idx_start:idx_end]:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            record = [str(_) for _ in record]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            item = QTreeWidgetItem(self.treeW, record)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            self.treeW.addTopLevelItem(item)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            colors = {"info": QColor(144, 238, 144), "warning": QColor(255, 240, 210), "error": QColor(255, 220, 220), "exception": QColor(255, 220, 220), "unknown": QColor(255, 220, 220)}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            color = colors[record[2]]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            for col in range(5):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            colors = {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                "info": QColor(255, 255, 255),  # 白色
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                "warning": QColor(244, 164, 96),  # 棕橙色
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                "error": QColor(205, 92, 92),  # 印度红
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                "exception": QColor(70, 130, 180),  # 钢蓝色
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                "unknown": QColor(190, 190, 190)  # 灰色
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            # colors = {"info": "#FFFFFF", "warning": "#F4A460", "error": "#CD5C5C", "exception": "#4682B4", "unknown": "#BEBEBE"}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            level = record[2]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            color = colors.get(level, QColor(255, 255, 255))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            for col in range(self.treeW.columnCount()):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                item.setBackground(col, color)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            item.setTextAlignment(0, Qt.AlignmentFlag.AlignRight)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            self.treeW.addTopLevelItem(item)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self.treeW.scrollToBottom()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    def show_single_log(self, item, column):
 | 
			
		
		
	
	
		
			
				
					
					| 
						
					 | 
				
			
			 | 
			 | 
			
				 
 |