总线通信架构整改完成
This commit is contained in:
		
							
								
								
									
										0
									
								
								toolbox/codes/ui/components/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								toolbox/codes/ui/components/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										45
									
								
								toolbox/codes/ui/components/list_widget_ui.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								toolbox/codes/ui/components/list_widget_ui.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,45 @@
 | 
			
		||||
from PySide6.QtGui import QFocusEvent
 | 
			
		||||
from PySide6.QtWidgets import QListWidget, QListWidgetItem
 | 
			
		||||
from PySide6.QtCore import Qt, QEvent
 | 
			
		||||
 | 
			
		||||
from codes.common import clibs
 | 
			
		||||
from codes.common.signal_bus import signal_bus
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class SListWidget(QListWidget):
 | 
			
		||||
    def __init__(self, parent=None):
 | 
			
		||||
        super().__init__(parent)
 | 
			
		||||
 | 
			
		||||
        self.predos()
 | 
			
		||||
        self.init_ui()
 | 
			
		||||
        self.setup_slot()
 | 
			
		||||
 | 
			
		||||
    def predos(self):
 | 
			
		||||
        ...
 | 
			
		||||
 | 
			
		||||
    def init_ui(self):
 | 
			
		||||
        for item in clibs.listW_items:
 | 
			
		||||
            _ = QListWidgetItem(item)
 | 
			
		||||
            _.setTextAlignment(Qt.AlignmentFlag.AlignCenter)
 | 
			
		||||
            self.addItem(_)
 | 
			
		||||
 | 
			
		||||
    def setup_slot(self):
 | 
			
		||||
        self.itemClicked.connect(self.item_clicked)
 | 
			
		||||
        signal_bus.qa_stacked_page_switch.connect(self.hide)
 | 
			
		||||
        signal_bus.list_widget_on_off.connect(self.lw_show_hide)
 | 
			
		||||
 | 
			
		||||
    def item_clicked(self, item):
 | 
			
		||||
        page_id = clibs.listW_items[item.text()]
 | 
			
		||||
        signal_bus.list_widget_click.emit(page_id)
 | 
			
		||||
 | 
			
		||||
    def lw_show_hide(self, enabled: bool):
 | 
			
		||||
        if enabled:
 | 
			
		||||
            self.clearSelection()
 | 
			
		||||
            self.show()
 | 
			
		||||
            signal_bus.init_stacked_page.emit("w10_practical")
 | 
			
		||||
        else:
 | 
			
		||||
            self.hide()
 | 
			
		||||
 | 
			
		||||
    def focusOutEvent(self, event: QFocusEvent):
 | 
			
		||||
        self.clearSelection()
 | 
			
		||||
        super().focusOutEvent(event)
 | 
			
		||||
							
								
								
									
										62
									
								
								toolbox/codes/ui/components/stacked_widget_ui.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								toolbox/codes/ui/components/stacked_widget_ui.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,62 @@
 | 
			
		||||
from pathlib import Path
 | 
			
		||||
import importlib.util
 | 
			
		||||
 | 
			
		||||
from PySide6.QtWidgets import QStackedWidget, QWidget, QLabel
 | 
			
		||||
from PySide6.QtCore import Qt
 | 
			
		||||
 | 
			
		||||
from codes.common import clibs
 | 
			
		||||
from codes.common.signal_bus import signal_bus
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class SStackedWidget(QStackedWidget):
 | 
			
		||||
    def __init__(self, parent=None):
 | 
			
		||||
        super().__init__(parent)
 | 
			
		||||
 | 
			
		||||
        self.predos()
 | 
			
		||||
        self.init_ui()
 | 
			
		||||
        self.setup_slot()
 | 
			
		||||
 | 
			
		||||
    def predos(self):
 | 
			
		||||
        self.page_list = {}
 | 
			
		||||
 | 
			
		||||
    def init_ui(self):
 | 
			
		||||
        # stacked widget  1x: 10为一级按钮页,其余为二级按钮页,2-9同理 | 0x. 日志/设置/关于等页面
 | 
			
		||||
        self.load_pages()
 | 
			
		||||
        w = self.page_list.get("w01_setting")
 | 
			
		||||
        self.setCurrentWidget(w)
 | 
			
		||||
 | 
			
		||||
    def setup_slot(self):
 | 
			
		||||
        signal_bus.init_stacked_page.connect(self.set_current_page)
 | 
			
		||||
        signal_bus.qa_stacked_page_switch.connect(self.set_current_page)
 | 
			
		||||
        signal_bus.list_widget_click.connect(self.set_current_page)
 | 
			
		||||
 | 
			
		||||
    def set_current_page(self, page_id: str):
 | 
			
		||||
        w = self.page_list.get(page_id)
 | 
			
		||||
        self.setCurrentWidget(w)
 | 
			
		||||
        signal_bus.current_stacked_page.emit(page_id)
 | 
			
		||||
 | 
			
		||||
    def load_pages(self):
 | 
			
		||||
        def to_camel(snake: str) -> str:
 | 
			
		||||
            # w01_setting -> W01Setting
 | 
			
		||||
            return "".join(word.capitalize() for word in snake.split('_'))
 | 
			
		||||
 | 
			
		||||
        def instantiate(pyFile: Path, className: str) -> QWidget | None:
 | 
			
		||||
            try:
 | 
			
		||||
                spec = importlib.util.spec_from_file_location(pyFile.stem, pyFile)
 | 
			
		||||
                module = importlib.util.module_from_spec(spec)
 | 
			
		||||
                spec.loader.exec_module(module)
 | 
			
		||||
                cls = getattr(module, className)
 | 
			
		||||
                if issubclass(cls, QWidget):
 | 
			
		||||
                    return cls()
 | 
			
		||||
            except Exception as e:
 | 
			
		||||
                print(f"加载 {pyFile} 失败: {e}")
 | 
			
		||||
 | 
			
		||||
        pages_dir = clibs.base_path / "codes/ui/stacked_pages/"
 | 
			
		||||
        for py_file in pages_dir.glob("w*.py"):
 | 
			
		||||
            page_id = py_file.stem          # w01_setting
 | 
			
		||||
            class_name = to_camel(page_id)  # W01Setting
 | 
			
		||||
            widget = instantiate(py_file, class_name)
 | 
			
		||||
            if widget:
 | 
			
		||||
                widget.setObjectName(page_id)    # 用于 findChild / 切换
 | 
			
		||||
                self.addWidget(widget)
 | 
			
		||||
                self.page_list[page_id] = widget
 | 
			
		||||
							
								
								
									
										0
									
								
								toolbox/codes/ui/components/statusbar_ui.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								toolbox/codes/ui/components/statusbar_ui.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										110
									
								
								toolbox/codes/ui/components/toolbar_ui.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								toolbox/codes/ui/components/toolbar_ui.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,110 @@
 | 
			
		||||
from PySide6.QtWidgets import QToolBar
 | 
			
		||||
from PySide6.QtGui import QAction, QIcon
 | 
			
		||||
from PySide6.QtCore import QSize
 | 
			
		||||
 | 
			
		||||
from codes.common import clibs
 | 
			
		||||
from codes.common.signal_bus import signal_bus
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class SToolBar(QToolBar):
 | 
			
		||||
    def __init__(self, parent=None):
 | 
			
		||||
        super().__init__(parent)
 | 
			
		||||
        self.predos()
 | 
			
		||||
        self.init_ui()
 | 
			
		||||
        self.setup_slot()
 | 
			
		||||
 | 
			
		||||
    def predos(self):
 | 
			
		||||
        ...
 | 
			
		||||
 | 
			
		||||
    def init_ui(self):
 | 
			
		||||
        # 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.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.setChecked(True)
 | 
			
		||||
        self.ac_switch.setObjectName("acSwitch")
 | 
			
		||||
        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;
 | 
			
		||||
            }
 | 
			
		||||
        """)
 | 
			
		||||
 | 
			
		||||
        # homepage
 | 
			
		||||
        self.ac_homepage = QAction()
 | 
			
		||||
        self.ac_homepage.setMenuRole(QAction.MenuRole.NoRole)
 | 
			
		||||
        self.ac_homepage.setStatusTip("Go to home page")
 | 
			
		||||
        self.ac_homepage.setToolTip("Ctrl+Alt+H")
 | 
			
		||||
        self.ac_homepage.setText("主页")
 | 
			
		||||
        self.addAction(self.ac_homepage)
 | 
			
		||||
 | 
			
		||||
        # setting
 | 
			
		||||
        self.ac_setting = QAction()
 | 
			
		||||
        self.ac_setting.setMenuRole(QAction.MenuRole.NoRole)
 | 
			
		||||
        self.ac_setting.setStatusTip("Go to setting page")
 | 
			
		||||
        self.ac_setting.setToolTip("Ctrl+Alt+S")
 | 
			
		||||
        self.ac_setting.setText("设置")
 | 
			
		||||
        self.addAction(self.ac_setting)
 | 
			
		||||
 | 
			
		||||
        # log
 | 
			
		||||
        self.ac_log = QAction()
 | 
			
		||||
        self.ac_log.setMenuRole(QAction.MenuRole.NoRole)
 | 
			
		||||
        self.ac_log.setStatusTip("Go to log page")
 | 
			
		||||
        self.ac_log.setToolTip("Ctrl+Alt+L")
 | 
			
		||||
        self.ac_log.setText("日志")
 | 
			
		||||
        self.addAction(self.ac_log)
 | 
			
		||||
 | 
			
		||||
        # about
 | 
			
		||||
        self.ac_about = QAction()
 | 
			
		||||
        self.ac_about.setMenuRole(QAction.MenuRole.NoRole)
 | 
			
		||||
        self.ac_about.setStatusTip("Go to about page")
 | 
			
		||||
        self.ac_about.setToolTip("Ctrl+Alt+A")
 | 
			
		||||
        self.ac_about.setText("关于")
 | 
			
		||||
        self.addAction(self.ac_about)
 | 
			
		||||
 | 
			
		||||
    def setup_slot(self):
 | 
			
		||||
        self.ac_switch.toggled.connect(self.ac_sw)
 | 
			
		||||
        self.ac_homepage.triggered.connect(self.ac_hp)
 | 
			
		||||
        self.ac_setting.triggered.connect(self.ac_sp)
 | 
			
		||||
        self.ac_log.triggered.connect(self.ac_lp)
 | 
			
		||||
        self.ac_about.triggered.connect(self.ac_ap)
 | 
			
		||||
        signal_bus.qa_stacked_page_switch.connect(self.change2hide)
 | 
			
		||||
 | 
			
		||||
    def ac_sw(self, checked: bool):
 | 
			
		||||
        self.ac_switch.setIcon(self.on_icon if checked else self.off_icon)
 | 
			
		||||
        print(f"checked: {checked}")
 | 
			
		||||
        signal_bus.list_widget_on_off.emit(checked)
 | 
			
		||||
 | 
			
		||||
    def ac_hp(self):
 | 
			
		||||
        signal_bus.home_overlay_trigger.emit()
 | 
			
		||||
 | 
			
		||||
    def ac_sp(self):
 | 
			
		||||
        signal_bus.qa_stacked_page_switch.emit("w01_setting")
 | 
			
		||||
 | 
			
		||||
    def ac_lp(self):
 | 
			
		||||
        signal_bus.qa_stacked_page_switch.emit("w08_log")
 | 
			
		||||
 | 
			
		||||
    def ac_ap(self):
 | 
			
		||||
        signal_bus.qa_stacked_page_switch.emit("w09_about")
 | 
			
		||||
 | 
			
		||||
    def change2hide(self):
 | 
			
		||||
        self.ac_switch.setChecked(False)
 | 
			
		||||
        self.ac_switch.setIcon(self.off_icon)
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user