总线通信架构整改完成

This commit is contained in:
2025-09-27 19:03:05 +08:00
parent c7c0d15545
commit 1c47497fc2
272 changed files with 592 additions and 304 deletions

View File

View 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)

View 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

View 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)