qss
This commit is contained in:
		@@ -4,26 +4,32 @@ from PySide6.QtCore import Qt
 | 
			
		||||
 | 
			
		||||
from codes.common import clibs
 | 
			
		||||
from codes.common.signal_bus import signal_bus
 | 
			
		||||
from codes.common.qss_reloader import qss_reloader
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class SListWidget(QListWidget):
 | 
			
		||||
    def __init__(self, parent=None):
 | 
			
		||||
        super().__init__(parent)
 | 
			
		||||
 | 
			
		||||
        self.predos()
 | 
			
		||||
        self.pre_do()
 | 
			
		||||
        self.init_ui()
 | 
			
		||||
        self.setup_slot()
 | 
			
		||||
        self.post_do()
 | 
			
		||||
 | 
			
		||||
    def predos(self):
 | 
			
		||||
    def pre_do(self):
 | 
			
		||||
        ...
 | 
			
		||||
 | 
			
		||||
    def init_ui(self):
 | 
			
		||||
        self.setObjectName("SListWidget")
 | 
			
		||||
        self.setMinimumWidth(150)
 | 
			
		||||
        for item in clibs.listW_items:
 | 
			
		||||
            _ = QListWidgetItem(item)
 | 
			
		||||
            _.setTextAlignment(Qt.AlignmentFlag.AlignCenter)
 | 
			
		||||
            self.addItem(_)
 | 
			
		||||
 | 
			
		||||
    def post_do(self):
 | 
			
		||||
        qss_reloader.register(clibs.qss_list_widget, self)
 | 
			
		||||
        self.setup_slot()
 | 
			
		||||
 | 
			
		||||
    def setup_slot(self):
 | 
			
		||||
        self.itemClicked.connect(self.item_clicked)
 | 
			
		||||
        signal_bus.stacked_page_switch_setting.connect(self.qa_hide)
 | 
			
		||||
 
 | 
			
		||||
@@ -21,6 +21,7 @@ class SStackedWidget(QStackedWidget):
 | 
			
		||||
        self.page_list = {"w01_setting": W01Setting(), "w08_log": W08Log(), "w09_about": W09About(), "w10_practical": W10Practical(), "w20_efficiency": W20Efficiency(), "w30_financial": W30Financial()}
 | 
			
		||||
 | 
			
		||||
    def init_ui(self):
 | 
			
		||||
        self.setObjectName("SStackedWidget")
 | 
			
		||||
        # stacked widget  1x: 10为一级按钮页,其余为二级按钮页,2-9同理 | 0x. 日志/设置/关于等页面
 | 
			
		||||
        for page_id, widget in self.page_list.items():
 | 
			
		||||
            widget.setObjectName(page_id)
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,25 @@
 | 
			
		||||
from PySide6.QtWidgets import QStatusBar
 | 
			
		||||
from PySide6.QtGui import QAction, QIcon
 | 
			
		||||
from PySide6.QtCore import QSize
 | 
			
		||||
 | 
			
		||||
from codes.common import clibs
 | 
			
		||||
from codes.common.signal_bus import signal_bus
 | 
			
		||||
from codes.common.qss_reloader import qss_reloader
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class SStatusBar(QStatusBar):
 | 
			
		||||
    def __init__(self, parent=None):
 | 
			
		||||
        super().__init__(parent)
 | 
			
		||||
        self.pre_do()
 | 
			
		||||
        self.init_ui()
 | 
			
		||||
        self.post_do()
 | 
			
		||||
 | 
			
		||||
    def pre_do(self):
 | 
			
		||||
        ...
 | 
			
		||||
 | 
			
		||||
    def init_ui(self):
 | 
			
		||||
        self.setObjectName("SStatusBar")
 | 
			
		||||
        ...
 | 
			
		||||
 | 
			
		||||
    def post_do(self):
 | 
			
		||||
        qss_reloader.register(clibs.qss_statusbar, self)
 | 
			
		||||
 
 | 
			
		||||
@@ -4,47 +4,34 @@ from PySide6.QtCore import QSize
 | 
			
		||||
 | 
			
		||||
from codes.common import clibs
 | 
			
		||||
from codes.common.signal_bus import signal_bus
 | 
			
		||||
from codes.common.qss_reloader import qss_reloader
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class SToolBar(QToolBar):
 | 
			
		||||
    def __init__(self, parent=None):
 | 
			
		||||
        super().__init__(parent)
 | 
			
		||||
        self.predos()
 | 
			
		||||
        self.pre_do()
 | 
			
		||||
        self.init_ui()
 | 
			
		||||
        self.setup_slot()
 | 
			
		||||
        self.post_do()
 | 
			
		||||
 | 
			
		||||
    def predos(self):
 | 
			
		||||
    def pre_do(self):
 | 
			
		||||
        ...
 | 
			
		||||
 | 
			
		||||
    def init_ui(self):
 | 
			
		||||
        self.setObjectName("SToolBar")
 | 
			
		||||
        # switch
 | 
			
		||||
        self.on_icon  = QIcon(f"{clibs.base_path}/assets/media/switch_on.png")   # 开状态图标
 | 
			
		||||
        self.off_icon = QIcon(f"{clibs.base_path}/assets/media/switch_off.png")  # 关状态图标
 | 
			
		||||
        self.on_icon  = QIcon(clibs.on_icon)   # 开状态图标
 | 
			
		||||
        self.off_icon = QIcon(clibs.off_icon)  # 关状态图标
 | 
			
		||||
        self.ac_switch = QAction(self.on_icon, "", self)
 | 
			
		||||
        self.ac_switch.setMenuRole(QAction.MenuRole.NoRole)
 | 
			
		||||
        self.ac_switch.setStatusTip("Switch side bar")
 | 
			
		||||
        self.ac_switch.setToolTip("Ctrl+Alt+T")
 | 
			
		||||
        self.ac_switch.setCheckable(True)          # 二态
 | 
			
		||||
        self.ac_switch.setCheckable(True)
 | 
			
		||||
        self.ac_switch.setChecked(True)
 | 
			
		||||
        self.ac_switch.setObjectName("acSwitch")
 | 
			
		||||
        self.setIconSize(QSize(30, 30))  # ← 一行决定图标像素
 | 
			
		||||
        self.setIconSize(QSize(30, 30))
 | 
			
		||||
        self.addAction(self.ac_switch)
 | 
			
		||||
        btn = self.widgetForAction(self.ac_switch)  # 取出实际 QToolButton
 | 
			
		||||
        btn.setStyleSheet("""
 | 
			
		||||
            QToolButton {
 | 
			
		||||
                background: transparent;
 | 
			
		||||
                border: none;
 | 
			
		||||
                outline: none;
 | 
			
		||||
            }
 | 
			
		||||
            /* 所有伪状态都透明,不让 Qt 画实心矩形 */
 | 
			
		||||
            QToolButton::hover,
 | 
			
		||||
            QToolButton::pressed,
 | 
			
		||||
            QToolButton::checked {
 | 
			
		||||
                background: transparent;
 | 
			
		||||
                border: none;
 | 
			
		||||
                outline: none;
 | 
			
		||||
            }
 | 
			
		||||
        """)
 | 
			
		||||
        btn.setObjectName("ac_switch")
 | 
			
		||||
 | 
			
		||||
        # homepage
 | 
			
		||||
        self.ac_homepage = QAction()
 | 
			
		||||
@@ -78,6 +65,10 @@ class SToolBar(QToolBar):
 | 
			
		||||
        self.ac_about.setText("关于")
 | 
			
		||||
        self.addAction(self.ac_about)
 | 
			
		||||
 | 
			
		||||
    def post_do(self):
 | 
			
		||||
        qss_reloader.register(clibs.qss_toolbar, self)
 | 
			
		||||
        self.setup_slot()
 | 
			
		||||
 | 
			
		||||
    def setup_slot(self):
 | 
			
		||||
        self.ac_switch.toggled.connect(self.ac_sw)
 | 
			
		||||
        self.ac_homepage.triggered.connect(self.ac_hp)
 | 
			
		||||
 
 | 
			
		||||
@@ -11,59 +11,70 @@ from codes.common.exception_handler import handle_exception
 | 
			
		||||
class LoginWindow(QWidget):
 | 
			
		||||
    def __init__(self):
 | 
			
		||||
        super().__init__()
 | 
			
		||||
        self.predos()
 | 
			
		||||
        self.pre_do()
 | 
			
		||||
        self.init_ui()
 | 
			
		||||
        self.setup_slot()
 | 
			
		||||
        self.post_do()
 | 
			
		||||
 | 
			
		||||
    def predos(self):
 | 
			
		||||
    def pre_do(self):
 | 
			
		||||
        db_operation.db_init()
 | 
			
		||||
        db_operation.db_conn()
 | 
			
		||||
 | 
			
		||||
    def init_ui(self):
 | 
			
		||||
        self.setObjectName("LoginWindow")
 | 
			
		||||
        self.setMinimumSize(420, 200)
 | 
			
		||||
        self.setMaximumSize(500, 240)
 | 
			
		||||
        self.resize(480, 200)
 | 
			
		||||
        self.setWindowTitle("登录")
 | 
			
		||||
        self.setWindowIcon(QIcon(f"{clibs.base_path}/assets/media/icon.ico"))
 | 
			
		||||
        self.setWindowIcon(QIcon(clibs.icon))
 | 
			
		||||
        self.setFont(QFont("Consolas", 14))
 | 
			
		||||
 | 
			
		||||
        self.layout_outer = QHBoxLayout()
 | 
			
		||||
        self.lb_logo = QLabel()
 | 
			
		||||
        self.lb_logo.setObjectName("lb_logo")
 | 
			
		||||
        self.lb_logo.setAlignment(Qt.AlignmentFlag.AlignCenter)
 | 
			
		||||
        self.lb_logo.setSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Preferred)
 | 
			
		||||
        self.lb_logo.setPixmap(QPixmap(f"{clibs.base_path}/assets/media/logo.png"))
 | 
			
		||||
        self.lb_logo.setPixmap(QPixmap(clibs.logo))
 | 
			
		||||
        self.lb_logo.setFixedSize(QSize(120, 120))
 | 
			
		||||
        self.lb_logo.setScaledContents(True)
 | 
			
		||||
        self.layout_outer.addWidget(self.lb_logo)
 | 
			
		||||
 | 
			
		||||
        self.tabW_login = QTabWidget()
 | 
			
		||||
        self.tabW_login.setObjectName("tabW_login")
 | 
			
		||||
        self.tab_login = QWidget()
 | 
			
		||||
        self.tab_login.setObjectName("tab_login")
 | 
			
		||||
        self.tabW_login.addTab(self.tab_login, "登录")
 | 
			
		||||
        self.tab_register = QWidget()
 | 
			
		||||
        self.tab_register.setObjectName("tab_register")
 | 
			
		||||
        self.tabW_login.addTab(self.tab_register, "注册")
 | 
			
		||||
        self.layout_outer.addWidget(self.tabW_login)
 | 
			
		||||
 | 
			
		||||
        # 登陆页面
 | 
			
		||||
        self.layout_H_username = QHBoxLayout()
 | 
			
		||||
        self.lb_username = QLabel("账号")
 | 
			
		||||
        self.lb_username.setObjectName("lb_username")
 | 
			
		||||
        self.lb_username.setAlignment(Qt.AlignmentFlag.AlignCenter)
 | 
			
		||||
        self.layout_H_username.addWidget(self.lb_username)
 | 
			
		||||
        self.le_username = QLineEdit()
 | 
			
		||||
        self.le_username.setObjectName("le_username")
 | 
			
		||||
        self.le_username.setFocus()
 | 
			
		||||
        self.layout_H_username.addWidget(self.le_username)
 | 
			
		||||
 | 
			
		||||
        self.layout_H_password = QHBoxLayout()
 | 
			
		||||
        self.lb_password = QLabel("密码")
 | 
			
		||||
        self.lb_password.setObjectName("lb_password")
 | 
			
		||||
        self.lb_password.setAlignment(Qt.AlignmentFlag.AlignCenter)
 | 
			
		||||
        self.layout_H_password.addWidget(self.lb_password)
 | 
			
		||||
        self.le_password = QLineEdit()
 | 
			
		||||
        self.le_password.setObjectName("le_password")
 | 
			
		||||
        self.le_password.setEchoMode(QLineEdit.EchoMode.Password)
 | 
			
		||||
        self.layout_H_password.addWidget(self.le_password)
 | 
			
		||||
 | 
			
		||||
        self.layout_H_button = QHBoxLayout()
 | 
			
		||||
        self.btn_login = QPushButton("登录")
 | 
			
		||||
        self.btn_login.setObjectName("btn_login")
 | 
			
		||||
        self.btn_login.setAutoDefault(True)
 | 
			
		||||
        self.btn_cancel = QPushButton("取消")
 | 
			
		||||
        self.btn_cancel.setObjectName("btn_cancel")
 | 
			
		||||
        self.btn_cancel.setAutoDefault(True)
 | 
			
		||||
        self.layout_H_button.addWidget(self.btn_login)
 | 
			
		||||
        self.layout_H_button.addWidget(self.btn_cancel)
 | 
			
		||||
@@ -77,32 +88,40 @@ class LoginWindow(QWidget):
 | 
			
		||||
        # 注册页面
 | 
			
		||||
        self.layout_H_username_reg = QHBoxLayout()
 | 
			
		||||
        self.lb_username_reg = QLabel("账号设定")
 | 
			
		||||
        self.lb_username_reg.setObjectName("lb_username_reg")
 | 
			
		||||
        self.lb_username_reg.setAlignment(Qt.AlignmentFlag.AlignCenter)
 | 
			
		||||
        self.layout_H_username_reg.addWidget(self.lb_username_reg)
 | 
			
		||||
        self.le_username_reg = QLineEdit()
 | 
			
		||||
        self.le_username_reg.setObjectName("le_username_reg")
 | 
			
		||||
        self.le_username_reg.setFocus()
 | 
			
		||||
        self.layout_H_username_reg.addWidget(self.le_username_reg)
 | 
			
		||||
 | 
			
		||||
        self.layout_H_password_reg = QHBoxLayout()
 | 
			
		||||
        self.lb_password_reg = QLabel("密码设定")
 | 
			
		||||
        self.lb_password_reg.setObjectName("lb_password_reg")
 | 
			
		||||
        self.lb_password_reg.setAlignment(Qt.AlignmentFlag.AlignCenter)
 | 
			
		||||
        self.layout_H_password_reg.addWidget(self.lb_password_reg)
 | 
			
		||||
        self.le_password_reg = QLineEdit()
 | 
			
		||||
        self.le_password_reg.setObjectName("le_password_reg")
 | 
			
		||||
        self.le_password_reg.setEchoMode(QLineEdit.EchoMode.Password)
 | 
			
		||||
        self.layout_H_password_reg.addWidget(self.le_password_reg)
 | 
			
		||||
 | 
			
		||||
        self.layout_H_password_reg_confirm = QHBoxLayout()
 | 
			
		||||
        self.lb_password_reg_confirm = QLabel("密码确认")
 | 
			
		||||
        self.lb_password_reg_confirm.setObjectName("lb_password_reg_confirm")
 | 
			
		||||
        self.lb_password_reg_confirm.setAlignment(Qt.AlignmentFlag.AlignCenter)
 | 
			
		||||
        self.layout_H_password_reg_confirm.addWidget(self.lb_password_reg_confirm)
 | 
			
		||||
        self.le_password_reg_confirm = QLineEdit()
 | 
			
		||||
        self.le_password_reg.setObjectName("le_password_reg")
 | 
			
		||||
        self.le_password_reg_confirm.setEchoMode(QLineEdit.EchoMode.Password)
 | 
			
		||||
        self.layout_H_password_reg_confirm.addWidget(self.le_password_reg_confirm)
 | 
			
		||||
 | 
			
		||||
        self.layout_H_button_reg = QHBoxLayout()
 | 
			
		||||
        self.btn_login_reg = QPushButton("确认")
 | 
			
		||||
        self.btn_login_reg.setObjectName("btn_login_reg")
 | 
			
		||||
        self.btn_login_reg.setAutoDefault(True)
 | 
			
		||||
        self.btn_cancel_reg = QPushButton("取消")
 | 
			
		||||
        self.btn_cancel_reg.setObjectName("btn_cancel_reg")
 | 
			
		||||
        self.btn_cancel_reg.setAutoDefault(True)
 | 
			
		||||
        self.layout_H_button_reg.addWidget(self.btn_login_reg)
 | 
			
		||||
        self.layout_H_button_reg.addWidget(self.btn_cancel_reg)
 | 
			
		||||
@@ -117,6 +136,9 @@ class LoginWindow(QWidget):
 | 
			
		||||
        self.setLayout(self.layout_outer)
 | 
			
		||||
        self.le_username.setFocus()
 | 
			
		||||
 | 
			
		||||
    def post_do(self):
 | 
			
		||||
        self.setup_slot()
 | 
			
		||||
 | 
			
		||||
    def setup_slot(self):
 | 
			
		||||
        self.tabW_login.currentChanged.connect(self.onChange_tabW)
 | 
			
		||||
        self.btn_login.clicked.connect(self.login_check)
 | 
			
		||||
 
 | 
			
		||||
@@ -6,13 +6,14 @@ import json
 | 
			
		||||
import sys
 | 
			
		||||
 | 
			
		||||
from PySide6.QtWidgets import QApplication, QWidget, QHBoxLayout, QMessageBox, QMainWindow, QStatusBar
 | 
			
		||||
from PySide6.QtGui import QFont, QIcon, QResizeEvent, QShortcut, QKeySequence, QAction
 | 
			
		||||
from PySide6.QtCore import Qt
 | 
			
		||||
from PySide6.QtGui import QIcon, QResizeEvent, QShortcut, QKeySequence, QAction
 | 
			
		||||
from PySide6.QtCore import Qt, QFileSystemWatcher
 | 
			
		||||
 | 
			
		||||
from codes.common import clibs, db_operation
 | 
			
		||||
from codes.ui.components.toolbar_ui import SToolBar
 | 
			
		||||
from codes.ui.components.list_widget_ui import SListWidget
 | 
			
		||||
from codes.ui.components.stacked_widget_ui import SStackedWidget
 | 
			
		||||
from codes.ui.components.statusbar_ui import SStatusBar
 | 
			
		||||
from codes.common.signal_bus import signal_bus
 | 
			
		||||
from codes.common.worker import Worker
 | 
			
		||||
from codes.common.exception_handler import handle_exception
 | 
			
		||||
@@ -22,38 +23,29 @@ from codes.ui.overlay_page.overlay_ui import WidgetWithBg
 | 
			
		||||
class MainWindow(QMainWindow):
 | 
			
		||||
    def __init__(self):
 | 
			
		||||
        super().__init__()
 | 
			
		||||
        self.predos()
 | 
			
		||||
        self.pre_do()
 | 
			
		||||
        self.init_ui()
 | 
			
		||||
        self.setup_slot()
 | 
			
		||||
        self.setup_sc()
 | 
			
		||||
        self.post_do()
 | 
			
		||||
 | 
			
		||||
    def predos(self):
 | 
			
		||||
    def pre_do(self):
 | 
			
		||||
        self.m = Path(__file__).stem
 | 
			
		||||
        self.home_overlay = None
 | 
			
		||||
        db_operation.db_backup()
 | 
			
		||||
        db_operation.db_conn()
 | 
			
		||||
 | 
			
		||||
    def init_ui(self):
 | 
			
		||||
        self.setObjectName("MainWindow")
 | 
			
		||||
        self.setMinimumSize(clibs.win_width, clibs.win_height)
 | 
			
		||||
        self.resize(clibs.win_width, clibs.win_height)
 | 
			
		||||
        self.setWindowTitle("Toolbox")
 | 
			
		||||
        self.setWindowIcon(QIcon(f"{clibs.base_path}/assets/media/icon.ico"))
 | 
			
		||||
        self.setFont(QFont("Consolas", 14))
 | 
			
		||||
        # 任务栏/主窗口/状态栏
 | 
			
		||||
        self.toolBar = SToolBar()
 | 
			
		||||
        self.addToolBar(self.toolBar)
 | 
			
		||||
        self.toolBar.setMovable(False)
 | 
			
		||||
        self.centralW = QWidget()
 | 
			
		||||
        self.setCentralWidget(self.centralW)
 | 
			
		||||
        self.statusBar = QStatusBar()
 | 
			
		||||
        self.statusBar.setStyleSheet("""
 | 
			
		||||
            QStatusBar {
 | 
			
		||||
                background: #8B8989;   /* 背景色 */
 | 
			
		||||
                color: #000000;        /* 文字色 */
 | 
			
		||||
                border: none;
 | 
			
		||||
                font: 14px "Consolas";
 | 
			
		||||
            }
 | 
			
		||||
        """)
 | 
			
		||||
        self.statusBar = SStatusBar()
 | 
			
		||||
        self.setStatusBar(self.statusBar)
 | 
			
		||||
 | 
			
		||||
        layout_h = QHBoxLayout()
 | 
			
		||||
@@ -69,6 +61,10 @@ class MainWindow(QMainWindow):
 | 
			
		||||
        signal_bus.home_overlay_close.connect(self.exit_overlay)
 | 
			
		||||
        self.install_sc()
 | 
			
		||||
 | 
			
		||||
    def post_do(self):
 | 
			
		||||
        self.setup_slot()
 | 
			
		||||
        self.setup_sc()
 | 
			
		||||
 | 
			
		||||
    def setup_sc(self, enable: bool = True):
 | 
			
		||||
        for sc_id, obj in self.sc_pool.items():
 | 
			
		||||
            if isinstance(obj, QAction):
 | 
			
		||||
@@ -134,7 +130,7 @@ class MainWindow(QMainWindow):
 | 
			
		||||
            for file in files:
 | 
			
		||||
                image_names.append(file.name.removesuffix(".jpg"))
 | 
			
		||||
            for image in res["images"]:
 | 
			
		||||
                image_name = "-".join([image["startdate"], image["title"]])
 | 
			
		||||
                image_name = "-".join([image["startdate"], image["hsh"]])
 | 
			
		||||
                if image_name in image_names:
 | 
			
		||||
                    continue
 | 
			
		||||
                else:
 | 
			
		||||
@@ -149,7 +145,6 @@ class MainWindow(QMainWindow):
 | 
			
		||||
            proverbs = []
 | 
			
		||||
            proverb_file = Path(f"{clibs.base_path}/assets/media/hitokoto.json")
 | 
			
		||||
            req = requests.get(hitokoto)
 | 
			
		||||
            print(f"req.text = {req.text}")
 | 
			
		||||
            if not proverb_file.exists():
 | 
			
		||||
                proverb_file.touch()
 | 
			
		||||
                proverb_file.write_text("[]")
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,7 @@ from zhdate import ZhDate
 | 
			
		||||
 | 
			
		||||
from codes.common import clibs
 | 
			
		||||
from codes.common.signal_bus import signal_bus
 | 
			
		||||
from codes.common.qss_reloader import qss_reloader
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class LunarClockLabel(QLabel):
 | 
			
		||||
@@ -35,7 +36,7 @@ class LunarClockLabel(QLabel):
 | 
			
		||||
        g = dt.date()
 | 
			
		||||
        z = ZhDate.today()
 | 
			
		||||
        week = "一二三四五六日"[g.dayOfWeek() - 1]
 | 
			
		||||
        text = f"{dt.toString('hh:mm:ss')}"
 | 
			
		||||
        text = f"{dt.toString('hh:mm')}"
 | 
			
		||||
        self.setText(text)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -50,25 +51,28 @@ class DoubleClickLabel(QLabel):
 | 
			
		||||
class WidgetWithBg(QWidget):
 | 
			
		||||
    def __init__(self, parent=None):
 | 
			
		||||
        super().__init__(parent)
 | 
			
		||||
        self.predos()
 | 
			
		||||
        self.pre_do()
 | 
			
		||||
        self.init_ui()
 | 
			
		||||
        self.setup_slot()
 | 
			
		||||
        self.post_do()
 | 
			
		||||
 | 
			
		||||
    def predos(self):
 | 
			
		||||
    def pre_do(self):
 | 
			
		||||
        font_id = QFontDatabase.addApplicationFont(f"{clibs.base_path}/assets/media/font/OldEnglishTextMT/OldEnglishTextMT.ttf")
 | 
			
		||||
        family = QFontDatabase.applicationFontFamilies(font_id)[0]
 | 
			
		||||
        self.lb_font = QFont(family, 28, QFont.Weight.Medium)
 | 
			
		||||
        self.lb_font = QFont(family, 32, QFont.Weight.Medium)
 | 
			
		||||
        self.background_pixmap = QPixmap(clibs.bg)
 | 
			
		||||
 | 
			
		||||
    def init_ui(self):
 | 
			
		||||
        self.setObjectName("WidgetWithBg")
 | 
			
		||||
        layout_v = QVBoxLayout()
 | 
			
		||||
        # 最上层的空白区
 | 
			
		||||
        self.lb_empty_up = QLabel(self)
 | 
			
		||||
        self.lb_empty_up.setObjectName("lb_empty_up")
 | 
			
		||||
        layout_v.addWidget(self.lb_empty_up)
 | 
			
		||||
        # 头像区
 | 
			
		||||
        layout_h_1 = QHBoxLayout()
 | 
			
		||||
        layout_h_1.addStretch(1)
 | 
			
		||||
        self.lb_avatar = DoubleClickLabel(self)
 | 
			
		||||
        self.lb_avatar.setObjectName("lb_avatar")
 | 
			
		||||
        self.lb_avatar.setAlignment(Qt.AlignmentFlag.AlignCenter)
 | 
			
		||||
        avatar = QPixmap(clibs.avatar)
 | 
			
		||||
        avatar = self.circle_pixmap(avatar, 200)
 | 
			
		||||
@@ -77,54 +81,41 @@ class WidgetWithBg(QWidget):
 | 
			
		||||
        self.lb_avatar.setFixedSize(144, 144)
 | 
			
		||||
        layout_h_1.addWidget(self.lb_avatar)
 | 
			
		||||
        self.lb_time = LunarClockLabel(self, flag=1)
 | 
			
		||||
        self.lb_time.setObjectName("lb_time")
 | 
			
		||||
        self.lb_time.setAlignment(Qt.AlignmentFlag.AlignCenter)
 | 
			
		||||
        self.lb_time.setStyleSheet("color: rgba(255,255,255,255);")
 | 
			
		||||
        self.lb_time.setFont(QFont("Arial Black", 56, QFont.Weight.Bold))
 | 
			
		||||
        layout_h_1.addWidget(self.lb_time)
 | 
			
		||||
        layout_h_1.addStretch(1)
 | 
			
		||||
        layout_v.addLayout(layout_h_1)
 | 
			
		||||
        # layout_v.addWidget(self.lb_avatar, alignment=Qt.AlignmentFlag.AlignCenter)
 | 
			
		||||
        # 艺术字区
 | 
			
		||||
        self.lb_name = QLabel(self)
 | 
			
		||||
        self.lb_name.setObjectName("lb_name")
 | 
			
		||||
        self.lb_name.setAlignment(Qt.AlignmentFlag.AlignCenter)
 | 
			
		||||
        self.lb_name.setText("Manford Fan · Code Create Life")
 | 
			
		||||
        self.lb_name.setStyleSheet("color: rgba(255,255,255,255);")
 | 
			
		||||
        self.lb_name.setFont(self.lb_font)
 | 
			
		||||
        layout_v.addWidget(self.lb_name)
 | 
			
		||||
        # 时间区-左横线
 | 
			
		||||
        layout_h = QHBoxLayout()
 | 
			
		||||
        self.line_left = QFrame(self)
 | 
			
		||||
        self.line_left.setObjectName("line_left")
 | 
			
		||||
        self.line_left.setFrameShape(QFrame.Shape.HLine)
 | 
			
		||||
        self.line_left.setFrameShadow(QFrame.Shadow.Plain)
 | 
			
		||||
        self.line_left.setStyleSheet("""
 | 
			
		||||
            QFrame {
 | 
			
		||||
                border: none;
 | 
			
		||||
                background-color: rgba(255, 255, 255, 40);
 | 
			
		||||
            }
 | 
			
		||||
        """)
 | 
			
		||||
        policy = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed)
 | 
			
		||||
        self.line_left.setSizePolicy(policy)
 | 
			
		||||
        self.line_left.setLineWidth(1)
 | 
			
		||||
        self.line_left.setFixedWidth(100)
 | 
			
		||||
        # 时间区-右横线
 | 
			
		||||
        self.line_right = QFrame(self)
 | 
			
		||||
        self.line_right.setObjectName("line_right")
 | 
			
		||||
        self.line_right.setFrameShape(QFrame.Shape.HLine)
 | 
			
		||||
        self.line_right.setFrameShadow(QFrame.Shadow.Plain)
 | 
			
		||||
        self.line_right.setStyleSheet("""
 | 
			
		||||
            QFrame {
 | 
			
		||||
                border: none;
 | 
			
		||||
                background-color: rgba(255, 255, 255, 40);
 | 
			
		||||
            }
 | 
			
		||||
        """)
 | 
			
		||||
        policy = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed)
 | 
			
		||||
        self.line_right.setSizePolicy(policy)
 | 
			
		||||
        self.line_right.setLineWidth(1)
 | 
			
		||||
        self.line_right.setFixedWidth(100)
 | 
			
		||||
        # 时间区-时间
 | 
			
		||||
        self.lb_date = LunarClockLabel(self)
 | 
			
		||||
        self.lb_date.setObjectName("lb_date")
 | 
			
		||||
        self.lb_date.setAlignment(Qt.AlignmentFlag.AlignCenter)
 | 
			
		||||
        self.lb_date.setStyleSheet("color: rgba(255,255,255,255);")
 | 
			
		||||
        self.lb_date.setFont(QFont("Consolas", 12, QFont.Weight.Bold))
 | 
			
		||||
        layout_h.addStretch(1)
 | 
			
		||||
        layout_h.addWidget(self.line_left)
 | 
			
		||||
        layout_h.addWidget(self.lb_date)
 | 
			
		||||
@@ -133,21 +124,22 @@ class WidgetWithBg(QWidget):
 | 
			
		||||
        layout_v.addLayout(layout_h)
 | 
			
		||||
 | 
			
		||||
        self.lb_proverb = QLabel(self)
 | 
			
		||||
        self.lb_proverb.setObjectName("lb_proverb")
 | 
			
		||||
        self.lb_proverb.setAlignment(Qt.AlignmentFlag.AlignCenter)
 | 
			
		||||
        self.lb_proverb.setText(clibs.proverb)
 | 
			
		||||
        self.lb_proverb.setStyleSheet("color: rgba(255,255,255,255);")
 | 
			
		||||
        self.lb_proverb.setFont(QFont("Consolas", 14, QFont.Weight.Bold))
 | 
			
		||||
        layout_v.addWidget(self.lb_proverb)
 | 
			
		||||
 | 
			
		||||
        self.le_password = QLineEdit(self)
 | 
			
		||||
        self.le_password.setObjectName("le_password")
 | 
			
		||||
        self.le_password.setEchoMode(QLineEdit.EchoMode.Password)
 | 
			
		||||
        self.le_password.setFont(QFont("Consolas", 12, QFont.Weight.Normal))
 | 
			
		||||
        # self.le_password.setFont(QFont("Consolas", 12, QFont.Weight.Normal))
 | 
			
		||||
        self.le_password.setMinimumWidth(300)
 | 
			
		||||
        self.le_password.setFixedHeight(30)
 | 
			
		||||
        layout_v.addWidget(self.le_password, alignment=Qt.AlignmentFlag.AlignCenter)
 | 
			
		||||
        self.hide_le_password()
 | 
			
		||||
 | 
			
		||||
        self.lb_empty_down = QLabel(self)
 | 
			
		||||
        self.lb_empty_down.setObjectName("lb_empty_down")
 | 
			
		||||
        layout_v.addWidget(self.lb_empty_down)
 | 
			
		||||
 | 
			
		||||
        layout_v.setStretch(0, 2)  # empty up
 | 
			
		||||
@@ -159,6 +151,10 @@ class WidgetWithBg(QWidget):
 | 
			
		||||
        layout_v.setStretch(6, 2)  # empty down
 | 
			
		||||
        self.setLayout(layout_v)
 | 
			
		||||
 | 
			
		||||
    def post_do(self):
 | 
			
		||||
        qss_reloader.register(clibs.qss_home_overlay, self)
 | 
			
		||||
        self.setup_slot()
 | 
			
		||||
 | 
			
		||||
    def setup_slot(self):
 | 
			
		||||
        self.lb_avatar.doubleClicked.connect(self.toggle_auth_show)
 | 
			
		||||
        self.le_password.returnPressed.connect(self.validate_password)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,7 @@
 | 
			
		||||
from PySide6.QtWidgets import QWidget, QLabel
 | 
			
		||||
 | 
			
		||||
from codes.common import clibs
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class W01Setting(QWidget):
 | 
			
		||||
    def __init__(self, parent=None):
 | 
			
		||||
@@ -15,6 +17,7 @@ class W01Setting(QWidget):
 | 
			
		||||
 | 
			
		||||
    def ui_init(self):
 | 
			
		||||
        self.lb_test = QLabel(f"testing text on widget: \n{__file__}", parent=self)
 | 
			
		||||
        self.lb_test.setObjectName("lb_test")
 | 
			
		||||
 | 
			
		||||
    def setup_slot(self):
 | 
			
		||||
        ...
 | 
			
		||||
 
 | 
			
		||||
@@ -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):
 | 
			
		||||
 
 | 
			
		||||
@@ -15,6 +15,7 @@ class W09About(QWidget):
 | 
			
		||||
 | 
			
		||||
    def ui_init(self):
 | 
			
		||||
        self.lb_test = QLabel(f"testing text on widget: \n{__file__}", parent=self)
 | 
			
		||||
        self.lb_test.setObjectName("lb_test")
 | 
			
		||||
 | 
			
		||||
    def setup_slot(self):
 | 
			
		||||
        ...
 | 
			
		||||
 
 | 
			
		||||
@@ -15,6 +15,7 @@ class W10Practical(QWidget):
 | 
			
		||||
 | 
			
		||||
    def ui_init(self):
 | 
			
		||||
        self.lb_test = QLabel(f"testing text on widget: \n{__file__}", parent=self)
 | 
			
		||||
        self.lb_test.setObjectName("lb_test")
 | 
			
		||||
 | 
			
		||||
    def setup_slot(self):
 | 
			
		||||
        ...
 | 
			
		||||
 
 | 
			
		||||
@@ -15,6 +15,7 @@ class W20Efficiency(QWidget):
 | 
			
		||||
 | 
			
		||||
    def ui_init(self):
 | 
			
		||||
        self.lb_test = QLabel(f"testing text on widget: \n{__file__}", parent=self)
 | 
			
		||||
        self.lb_test.setObjectName("lb_test")
 | 
			
		||||
 | 
			
		||||
    def setup_slot(self):
 | 
			
		||||
        ...
 | 
			
		||||
 
 | 
			
		||||
@@ -15,6 +15,7 @@ class W30Financial(QWidget):
 | 
			
		||||
 | 
			
		||||
    def ui_init(self):
 | 
			
		||||
        self.lb_test = QLabel(f"testing text on widget: \n{__file__}", parent=self)
 | 
			
		||||
        self.lb_test.setObjectName("lb_test")
 | 
			
		||||
 | 
			
		||||
    def setup_slot(self):
 | 
			
		||||
        ...
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user