这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

GUI 组件

Quatm 的图形界面组件:实验浏览、参数编辑、任务调度、数据可视化与设备监控。

Quatm 提供了完整的可视化图形界面。以下是所有 GUI 组件的详细文档。

组件索引

组件文档简介
🔍 实验浏览器主窗口:文件树、队列/准备台/循环器与 MDI 实验窗口
⚙️ 实验管理器核心执行引擎:测量→序列→单次运行的生命周期管理
📋 实验队列任务队列表格:优先级排序、状态跟踪、暂停/终止/重启
📝 准备台参数暂存、复制、循环构建后推入队列
🔁 循环器条件循环:根据测量结果自动切换实验组
🪟 实验窗口单实验控制:动态参数网格、提交/扫描与 JSON 参数
🎛️ 参数系统FloatBox/BoolBox/ComboBox:参数 GUI 控件体系
🌲 属性编辑器基于 ParameterTree 的键值浏览
📈 实时绘图实时一维数据流:多曲线、缩放、订阅管理
💡 LED指示灯红/绿 LED 状态灯:径向渐变动画
🧱 GUI基础类BWidget/BMainWindow/BFrame,窗口持久化
📷 图像监视器自动刷新图像显示:订阅图像/掩码流、降噪与亮斑检测
📊 分析管理器分析进程的启动/停止/状态监控
📡 数据流监视器多类型数据流:曲线/图像/消息三合一监视
✏️ 序列编辑器代码编辑 + 解析模拟与输出通道时序可视化
进程管理器五类后台进程(Server/Driver/GUI/Viewer/Monitor)
🔌 设备管理器PyVISA 设备发现与驱动绑定
💾 数据存储HDF5 存储/加载 + 定时自动保存
⏱️ 自动保存定时保存时间表编辑器
📈 实时滚动图实时滚动折线/散点图:运行平均 + 多曲线
📐 数据模型DictSyncModel:字典/列表到 Qt 表格映射
🔧 实验辅助ODT 对准 + 电场补偿 + 压电镜 + Verdi 对准
🎚️ 参数框紧凑型标签-数值实时参数显示
🗂️ 可折叠组件手风琴式可折叠面板对话框
🧩 实验参数面板实验参数控制面板
🔌 DAC 控制器FPGA DAC 手动设置工具
🧵 后台工作线程QRunnable 后台工作线程:信号驱动
⏱️ 时序浏览器实验时序可视化(DAC+TTL 图表)
📊 滚动波形窗口多通道实时滚动波形显示
📡 订阅编辑器数据/图像流订阅管理
📋 表格参数实验参数树表格编辑节点
🎯 远程 ROI可远程同步的 ROI 组件
🖼️ 图像查看器科学图像查看器(线剖面+LUT)
🔔 属性检查器属性健康轮询+异常告警
📐 辅助绘图工具通用测量数据绘图(多Y轴+滤波+拟合)

架构总览

┌──────────────────────────────────────┐
│            Browser(主窗口)            │
├────────────────┬─────────────────────┤
│ FileSelector   │    QMdiArea          │
│ (实验文件树)    │   ExperimentWindow   │
│                │   (单实验控制窗口)    │
├────────────────┴─────────────────────┤
│  顶部停靠:实验队列 / 准备台 / 循环器      │
├──────────────────────────────────────┤
│       ExperimentManager(执行引擎)     │
└──────────────────────────────────────┘

相关模块一览

主题模块
队列/准备台表格模型widgets/models.py(ScheduleModel / PrepModel)
订阅编辑editors/subscription_editor.py
自动保存时间表editors/auto_save_editor.py
属性树编辑entries/property_editor.py
实时更新绘图entries/updating_plot.py
滚动波形 / 实时滚动图entries/scrollwindow.pyentries/live_plot.py
数据流监控streammonitor/
图像监控 / 图像查看entries/image_monitor.pyentries/image_group.py
对准辅助alignment/(odt / comp / verdi helper)
压电镜控制entries/piezo_mirror_controler.py
H5 数据管理h5storage/

启动

主程序 实验浏览器 与各独立工具通常由进程管理器(ProcessManager)按类别启动, 也可在程序中直接实例化对应主窗口类(见各组件页面用法)。

1 - 实验浏览器

Quatm 主窗口:实验浏览、队列管理、多窗口 MDI 工作区。

概述

quatm/GUI/browser/main_window.py 提供 实验浏览器(Browser):Quatm 的主应用 窗口,基于 QMainWindow + QMdiArea 多文档界面。左侧文件选择器浏览实验脚本, 顶部停靠实验队列、准备台与循环器,中央 MDI 区内每个实验一个子窗口。

布局

┌─────────────┬───────────────────────────────┐
│ FileSelector │   QMdiArea(实验子窗口区)      │
│ (实验文件树) │   ┌─────────────────────┐   │
│             │   │  ExperimentWindow    │   │
├─────────────┤   └─────────────────────┘   │
│ 队列 / 准备台 │                               │
│ / 循环器停靠  │                               │
└─────────────┴───────────────────────────────┘

核心组件

组件模块描述
FileSelectorbrowser/file_selector.py实验目录树,双击打开实验/模拟窗口
ExperimentWindowbrowser/experiment_window.py中央 MDI 中单个实验的控制面板
ExperimentQueueexperiment/experiment_queue.py表格化任务队列
ExperimentManagerexperiment/experiment_manager.py从队列取任务并执行
PrepStationexperiment/prepstation.py任务发往队列前的暂存与编辑
Looperlooper/ui.py按测量结果条件循环运行一组任务

上述组件的细节见本目录的对应页面。

生命周期

  • init_ui / create_dock_widgets:按屏幕适配默认几何,创建 MDI 画布与两侧停靠 部件(左侧文件选择器;顶部队列/准备台/循环器)。
  • open_experiment:打开实验窗口;已打开则从最小化恢复并置前。
  • closeEvent:先保存主窗口几何与全部实验子窗口状态,再停止队列/循环等 worker 线程,最后交给基类完成关闭。
  • moveEvent / resizeEvent:防抖保存几何,下次启动时恢复窗口位置与尺寸。

用法

from quatm.GUI.browser.main_window import Browser

browser = Browser()
browser.show()

实验浏览器是运行除 Helper 之外所有实验的界面,通常作为主进程由进程管理器启动。

2 - 实验管理器

核心实验执行引擎:从实验队列取任务并按测量/序列/运行层级调度。

概述

quatm/GUI/experiment/experiment_manager.py 提供实验管理器(ExperimentManager ):从实验队列(ExperimentQueue)取出任务并执行的引擎。其队列轮询运行在 worker 线程,任务按 测量(measurement)→ 重复(repetition)→ 序列/扫描 (sequence)→ 单次运行(run) 的层级结构调度。

执行流程

queue_fn(worker 线程持续轮询队列)
  └─→ run(任务包装:任何结束方式都保证收尾)
       ├─→ start_measurement(测量开始钩子)
       ├─→ start_sequence(序列/扫描开始钩子)
       │     └─→ … 多次带变化参数的 run …
       ├─→ end_sequence(序列结束钩子)
       └─→ end_measurement(测量结束钩子并清理任务表)

关键方法

方法说明
queue_fn持续轮询队列任务字典:按优先级、任务号与预约时间挑选任务
run任务运行包装:无论 Done/Terminated/Failed/删除都正常收尾
pause暂停当前实验;再次调用恢复
terminate_experiment优雅终止:让当前这一次 run 自然跑完再停止
start_measurement调用实验的 start/end 各阶段钩子
set_dict把单个参数写入实验对象实例属性
set_run_nr / set_rep_nr同步运行/重复序号到任务字典并刷新表格
due_check判断任务是否到预约执行时间
start_queue / shutdown启动 / 停止常驻队列 worker
update_table通知 GUI 刷新任务表显示

用法

from quatm.GUI.experiment.experiment_manager import ExperimentManager

manager = ExperimentManager(browser)   # browser 提供队列与界面
manager.start_queue()                  # 启动常驻队列 worker

任务在独立 worker 线程中执行,不阻塞 GUI;浏览器关闭时调用 shutdown 停止队列 worker 以便进程干净退出。

3 - 实验队列

任务队列表格面板:维护实验任务的优先级排序、状态跟踪与生命周期管理(暂停/终止/休眠/删除)。

概述

ExperimentQquatm/GUI/experiment/experiment_queue.py)是 实验浏览器(Browser) 主窗口里的「实验队列」面板:一个由队列表格模型 ScheduleModel(模块 quatm/GUI/widgets/models.py)驱动的任务表格。任务字典以 任务号 为主键存放, 每个任务是一条含运行所需信息的记录;表格按优先级 priority(数值小者优先)→ 任务号排序。

任务状态

实验管理器(ExperimentManager) 与面板共同维护每个任务的状态:

状态含义
Queued已入队、等待执行
Waiting设置了到期时间(due),未到期前暂不执行
Sleeping休眠中,管理器暂时忽略(可再次点击唤醒)
Running正在执行单次运行
Scanning正在执行序列/扫描
Paused已暂停,可恢复继续
Terminating / Termination Pending正在优雅终止(允许当前运行跑完)
Done执行完成
Failed执行失败

操作与快捷键

  • 按钮栏(由 create_buttons 创建):暂停/恢复、终止选中任务、终止全部等 图标按钮。
  • 右键菜单与单键快捷键init_table_actions):e 编辑参数、v 只读预览、 删除、休眠/唤醒、暂停等。
  • 删除正在运行的任务:自动转为优雅终止(delete_clicked)。
  • 终止terminate_clicked / terminate_all):优雅停止,让正在进行的运行 先跑完再结束。

主要方法

方法功能
submit(taskDict)唯一的入队入口(运行在界面线程):集中分配任务号;循环器(Looper)也经 submitItem 信号走到这里
pause()暂停/恢复当前正在运行的实验
set_sleeping()把所选任务标记为休眠或唤醒
delete_item(k) / delete_clicked()按任务号删除,或删除所选行(正在运行则优雅终止)
terminate_clicked() / terminate_all()优雅终止所选任务 / 全部任务
update_item(k, v)按任务号更新模型条目并复位锁
open_editor() / open_viewer()编辑 / 只读预览所选任务的参数(快捷键 e / v

数据模型

# 任务字典结构(主键 = 任务号)
expDict = {
    1: {
        "expName": "Rabi 扫描",
        "filepath": "experiments/ion/rabi.py",
        "status": "Queued",
        "priority": 1,
        "args": {},
        "due": "",
    },
}

排序规则:priority(数值小者优先)→ 任务号(先入先出)。

与循环器的关系

循环器(Looper) 的任务条目提交也统一经 ExperimentQ.submit() 入队,因此桌面 界面与循环调度共用同一条“集中分配任务号”的入队通道。

4 - 准备台

实验参数暂存与编辑区:在推入队列前预览、排序和微调任务。

概述

PrepStation 是实验浏览器(Browser)顶部 dock 中的一个标签页,作为实验队列的 “暂存区”:把尚未准备就绪的任务先存放于此,确认无误后再推入 ExperimentQ 排队 执行。任务列表持久化在 configuration/browser/prepfile.json,并可在浏览器端 实验控制台(Web 远程控制)中查看与操作。

功能

操作说明
📋 暂存实验窗口点击 Prep 按钮,把当前参数(含扫描定义)暂存到任务列表
➡️ 推送把选中任务复制到 ExperimentQ(队列保留任务编号、优先级、扫描参数等完整信息)
🔁 加入循环把选中任务加入 Looper 循环组(push_to_looper
↕️ 排序上移/下移调整任务顺序
💤 休眠标记为 Sleeping 后暂不参与推送
✏️ 编辑/查看打开任务参数编辑器或只读视图
💾 保存/加载参数集另存为 JSON(experiment_params/<实验>/<日期>/

任务数据结构

每个暂存任务与队列任务同构(由实验窗口 setup_task_dict() 生成):

task = {
    'task': 12,                 # 任务编号
    'expName': 'Absorption',    # 实验名
    'label': 'scan: freq 2:1',  # 标签(含扫描前缀)
    'priority': 0,
    'args': {'count': 5},       # 实验参数
    'nRuns': 21,                # 扫描点数
    'scanpars': ['freq'],       # 扫描参数
    'scanvals': [[...]],        # 扫描值
    'scansequence': [...],      # 扫描顺序(随机化后)
    'nReps': 1,
    'status': 'Queued',         # Queued / Sleeping / Waiting
    'filepath': '.../absorption.py',
}

持久化与共享

  • 任务列表保存在 configuration/browser/prepfile.json,浏览器重启后自动恢复;
  • 桌面 GUI 与 Web 远程控制 平台共用 同一份文件, 任意一端暂存/推送/排序/休眠的任务在另一端立即可见。

5 - 循环器

条件循环执行器:根据测量结果自动决定是否重复、跳转或终止实验循环。

概述

Looper循环器)是实验浏览器(Browser)顶部 dock 的标签页 (quatm/GUI/looper/),管理实验任务组,按顺序执行组内条目,并根据测量结果决定 跳转或终止。循环定义持久化在 configuration/browser/looper/loopfile.json,与浏览器 端实验控制台(Web 远程控制)共用 同一份文件

核心逻辑

LoopManager.run_loop():从起始组开始,无限循环直到 terminate
  └─→ 按顺序执行组内条目
       ├─ Task:提交任务到实验队列,等待完成后推进
       │        (可设最大次数 / 最大连续次数,达到即终止循环)
       └─ Conditional:读取数据流字段 → 比较(> >= == != =< <)
                ├─ 满足 → 跳转到指定条目 / 组尾 / 结束循环
                └─ 不满足 → 跳转到 else 条目

组件

组件说明
LoopGroup循环组(一个标签页),内含条目列表与循环构建器
LoopItem条目基类(删除/上移/下移/运行计数/指示灯)
TaskItem任务条目:指向暂存器任务,支持最大次数/最大连续/skip
ListItem任务列表条目:逐个展开任务列表运行
ConditionalItem数据条件条目:字段比较后跳转(if/else)
ConditionalReachedItem到达序号条件条目:当前时刻达到第 N 次周期 h5 保存时刻后跳转
ConditionalDateTimeItem时间条件条目
CallerItem / GroupItem组间跳转与组尾条目
DataManager订阅数据流、累积最新测量值
LoopManager循环执行器(run_loop() / terminate(),后台线程运行)
AutoSaveEditor自动 HDF5 保存计划配置

使用方式

实验浏览器(Browser) 中通过循环器(Looper)标签页交互操作:

  1. 添加组:新建标签页(New Tab #N),可重命名;
  2. 添加条目:每个组内可添加 Task / List / Conditional / ConditionalDateTime / ConditionalReached / Caller 等条目;
  3. 配置条目:Task 选择暂存器任务编号并设置最大次数;Conditional 选择数据 字段、比较符与阈值,配置 if/else 跳转目标(条目序号 / end box / end loop);
  4. 运行:选择起始组,点击运行;LoopManager 在后台线程执行,终止按钮随时 停止。
# 核心类(GUI 内部使用)
from quatm.GUI.looper import Looper, LoopManager

looper = Looper(parent=browser)
looper.loopManager.run_loop()      # 从起始组开始循环
looper.loopManager.terminate()     # 终止循环

持久化与共享

  • 循环定义自动保存到 configuration/browser/looper/loopfile.json{组名: [条目字典, ...]}),浏览器重启后自动恢复;
  • 桌面 GUI 与 Web 远程控制平台共用同一份文件,任意一端的修改另一端立即可见; 浏览器端同样支持组管理、Task/Conditional 条目编辑与循环启停。

6 - 实验窗口

单实验控制窗口:动态参数网格、提交/扫描与参数持久化。

概述

quatm/GUI/browser/experiment_window.py 提供 实验窗口(ExperimentWindow): 每个实验脚本在浏览器 MDI 区对应一个由 ExperimentSubWindow 承载的控制窗口,按 实验声明的参数对象自动生成参数网格,负责提交队列/预备、扫描构建与 JSON 参数存取 。

组件

组件说明
ExperimentSubWindow图形容器:保存窗口几何并把窗口钳制在可视区内
ExperimentWindow单实验控制面板:参数网格 + 提交/扫描/保存控件
SequenceEditor扫描序列对话框:逐维设定起止与步数生成 nD 扫描

关键方法(ExperimentWindow)

方法说明
submit_to_queue把当前实验提交到实验队列执行(各提交入口的统一入口)
submit_next以最高优先级提交,排在所有已有任务之前
submit_to_prepper提交到准备台(PrepStation)暂存
setup_scan按扫描定义构建扫描序列(参数值与随机运行顺序)
setup_task_dict构造存入队列/准备台的任务字典
build_argument_dict由参数网格各控件取值生成完整参数字典
save_params / load_params参数存为 JSON(按日期/时间命名,可备份)与回载
adaptive_columns按窗口宽度自动重排参数网格列数(约每 200 px 增一列)
edit_sequence打开扫描序列编辑窗口并应用新序列

用法

from quatm.GUI.browser.experiment_window import ExperimentWindow

# 通常由 Browser.open_experiment 打开;也可自行构造
win = ExperimentWindow(filepath=..., props=props, parent=subwindow, browser=browser)

实验脚本声明的参数对象(如 NumberValue / BoolValue / StringCombo)会自动生 成带标签、单位与范围的编辑控件;参数组可保存为 json 并在以后加载复用。

7 - 参数系统

BasicManager 参数管理器体系:把实验属性映射为数值/布尔/下拉/频率控件。

概述

quatm/GUI/entries/dashboard.py 提供一套“参数管理器”控件体系:每个管理器 把一个实验参数(存于属性库,内部一律用 SI 单位)映射为一个带标签的输入控件,并 在界面与属性库之间双向同步。

控件类体系

BasicManager(数值类参数条目的基类)
├── IntManager        → 整数微调框
├── FloatManager      → 浮点微调框(可带单位/步进/小数位)
├── BoolManager       → 勾选框
├── ComboManager      → 下拉框(字符串列表)
└── FrequencyManager  → DDS 频率微调框(属性存 Hz,界面显示 MHz)

用法(示意)

from quatm.GUI.entries.dashboard import IntManager, FloatManager, BoolManager

# 每个管理器绑定属性库 props 与实验 exp,按参数名读写
mgr = IntManager(props=props, exp=exp, parname="my_int")
fmgr = FloatManager(props=props, exp=exp, parName="cooling_time", unit="µs")
bmgr = BoolManager(props=props, exp=exp, parName="enable")

界面改动会换算成 SI 写回属性库;属性库变化也会由各控件周期同步到界面显示 (updateValue / updateSpin)。

另见「实验参数面板」:Dashboard 主面板据此把整台设备的参数自动排布成 可调控制面板。

8 - 属性编辑器

基于 ParameterTree 的属性查看与编辑工具。

概述

quatm/GUI/entries/property_editor.py 提供基于 parametertree 的属性 编辑工具:把属性库的键值树展示成可展开/可编辑的参数树,支持搜索过滤,修改即写回。

组件

组件说明
TreeEditProperties 提取信息并整理成树视图结构
PropEdit属性编辑主窗口(ParameterTree):子树浏览、搜索、保存/删除所选节点

用法

from quatm.GUI.entries.property_editor import PropEdit

editor = PropEdit(name="设备状态", props=props, subtree="/", parent=parent)

注:以 subtree 限定只展示某一路径下的属性;TreeEdit 负责把属性字典转换为 Parameter 节点树。

9 - 实时绘图

订阅数据流并持续更新的实时绘图项及其控件容器。

概述

quatm/GUI/entries/updating_plot.py 提供 实时绘图UpdatingPlotPlotItem 子类,订阅数据流后定时拉取新数据并刷新曲线;LivePlot 则 是内嵌一个 UpdatingPlot 的控件容器,方便作为停靠面板嵌入其它窗口。

组件

组件说明
UpdatingPlot实时绘图项:订阅数据流并持续更新曲线
LivePlot控件容器:内嵌一个 UpdatingPlot,可附带图像流名

关键方法(UpdatingPlot)

方法说明
setnewData定时拉取新数据;一维数组自动补 x 轴,再按旋转标志更新曲线
updateConfiguration取消旧订阅,按属性里配置的流列表重新订阅并建曲线
subscribe_window打开订阅编辑器勾选数据流,关闭后重新应用订阅配置
configureWindow打开属性编辑对话框调整设置并重新应用显示配置

用法

from quatm.GUI.entries.updating_plot import UpdatingPlot, LivePlot

plot = UpdatingPlot(name="PMT 信号")        # 直接作为绘图项使用
host = LivePlot(name="PMT 信号", parent=parent)  # 或作为容器嵌入界面

订阅在绘图项的右键菜单中完成;LivePlot 也用作图像查看器中行/列剖面图的容器。

10 - LED 指示灯

LED 状态指示灯:支持绿/红/青配色、径向渐变与亮灭两种外观。

概述

LedIndicatorquatm/GUI/widgets/qled.py)是一个可选中切换亮/灭外观的 LED 指示按钮:双层圆形外壳加中心渐变,选中(亮)时用高亮配色,未选中(暗)时呈暗色。 常用于显示设备连接状态、实验运行状态与循环条目执行反馈。

颜色模式

方法说明
set_green()绿色系:选中亮绿、未选中暗绿,通常表示正常/就绪
set_red()红色系:选中亮红、未选中暗红,通常表示错误/警告
set_cyan()青色系:循环器条件条目等待数据时使用

亮/灭(勾选)状态可用 setChecked(True/False) 控制;onColor1/onColor2offColor1/offColor2 属性可自定义亮态与暗态的主/辅颜色。

用法

from quatm.GUI.widgets.qled import LedIndicator

led = LedIndicator(parent=parent)
led.set_green()      # 设备就绪
led.setChecked(True) # 点亮
# ...
led.set_red()        # 设备异常

11 - GUI 基础类

BWidget、BMainWindow、BFrame:带几何持久化和属性通信的 Qt 基类。

概述

quatm/GUI/widgets/quatmQt.py 定义了 Quatm 图形界面各组件的基类与常用控件:提供 窗口几何持久化、Properties 属性命名空间,以及带补全的下拉框等。

类层次

QWidget  → BWidget
QFrame   → BFrame
QMainWindow → BMainWindow

基类与混入

组件说明
GeometrySaveMixin把窗口几何持久化到 QSettings(按窗口名分键);关闭、移动、缩放时(防抖)保存
BWidgetQuatm 控件基类:带 Properties 命名空间与几何持久化
BFrame对应 QFrame 的基类,行为同 BWidget
BMainWindow带几何持久化与属性句柄的主窗口基类
from quatm.GUI.widgets.quatmQt import BWidget, BMainWindow

widget = BWidget(name="my_widget", parent=None)
window = BMainWindow(name="MainWindow", parent=None)

搜索与补全控件

组件说明
CustomCompleter带匹配模式的补全器(contains 前缀包含 / begins 前缀开头)
SearchComboBox启用自动补全、可输入搜索的下拉框;add_if_new() / find_or_add() 便捷维护条目
SearchLineEdit供搜索框使用的编辑框:聚焦全选、失焦/回车记录、Escape 还原
from quatm.GUI.widgets.quatmQt import SearchComboBox

box = SearchComboBox(parent=parent)
box.add_if_new("my_stream")

12 - 图像监视器

自动更新的图像显示控件:订阅图像/掩码流、降噪与亮斑检测、级别与 ROI 配置。

概述

quatm/GUI/entries/image_monitor.py 提供自动更新的图像显示窗口(ImageDisplay ):定时从属性中订阅的图像流拉取最新帧,按分辨率与偏移变换后刷新显示,并可同 步叠加掩码流;内置降噪、亮斑检测、当前帧保存与属性配置(显示级别、ROI 等)等 功能。

方法

方法说明
update_image定时拉取图像流,逐帧按分辨率/偏移变换后刷新显示
update_mask拉取掩码流,按掩码分辨率/偏移更新叠加层几何位置
noise_filter按属性参数做双边滤波 + 中值滤波降噪
spot_detector按阈值把图像二值化以检测亮斑
saveCurrentImage把当前显示帧保存为 PNG(按时间命名)
subscribe_window打开订阅对话框勾选图像流后重新订阅
subscribe_mask打开订阅对话框勾选掩码流后重新订阅
configureWindow打开属性编辑对话框调整显示级别、ROI 等参数

用法

from quatm.GUI.entries.image_monitor import ImageDisplay

view = ImageDisplay(imagestreams=["camera/image"], parent=parent)
view.configureWindow()   # 调整显示级别、ROI 等

说明:ImageDisplay 既是ImageWindow 的中央显示器,也可单独嵌入其它界面。图 像流与掩码流列表保存在属性中,右键菜单提供订阅、掩码订阅与配置入口。

13 - 分析管理器

树形视图面板:管理分析脚本的启动、停止、状态监控与自动重启。

概述

quatm/GUI/entries/analysismanager.py 提供 分析管理器:以可勾选树表列出各分析 脚本(名称 / 脚本 / 类别 / 输入流),负责启停子进程、监视与自动重启,并支持新增、 删除与配置分析条目。

组件

组件说明
AnalysisManager主面板:装载并组织分析条目,提供删除/配置入口
TreeViewWidget分析脚本管理树:勾选即启停、监视自动重启、增删改
addAnalysisWidget新增分析条目的工具栏(名称 / 类别 / 脚本 / 输入流)

功能

操作说明
▶️ 勾选启动勾选某条目即启动对应分析子进程;取消勾选即停止
⏹ 停止endProcess:先终止、短等退出,超时再强制结束
🔄 状态刷新updateStatus:周期检查进程是否仍在运行
🧹 清理游离进程killVagabonding:结束上一轮遗留的同脚本进程
➕ 新增 / 配置 / 删除工具栏注册新条目;选中行可配置属性或删除

用法

from quatm.GUI.entries.analysismanager import AnalysisManager

mgr = AnalysisManager(name="AnalysisManager", parent=parent)

分析脚本是独立进程:勾选某条目后,管理器用当前解释器拉起脚本并把项目环境变量 注入子进程,因此分析代码与主程序相互隔离,脚本崩溃不会影响实验。

14 - 数据流监视器

数据流监控:数据/图像/命令/消息多标签监控与单流面板。

概述

quatm/GUI/streammonitor/ 提供 数据流监视器MainWindow 以标签页容纳数据流 (Data)、图像流(Image)、命令(Command)、消息日志(Message)与历史(History) 等监控;每个监控标签由 StreamMonitor 订阅单一数据流并实时展示。

组件

组件说明
MainWindow监控主窗口:多标签页容器 + 菜单
StreamMonitor单流监控面板:订阅某一数据流并实时展示
MessageTableModel消息日志表格模型(时间戳/来源/级别/内容,按级别着色)
ImageTableModel图像流元数据表格(固定时间/来源列 + 动态键列)
AutoSortProxyModel按时间戳降序的自动排序代理模型

监控类型

标签页内容
Data数值数据流的实时曲线/表格
Image科学图像流及其元数据
Command命令 / 指令流
Message消息日志(时间戳/来源/级别/内容)
History历史记录

用法

from quatm.GUI.streammonitor import MainWindow, StreamMonitor

win = MainWindow(parent=parent)   # 多标签监控主窗口
panel = StreamMonitor(name="PMT", stream_type="Data", parent=parent)  # 单流面板

该监控界面通常作为独立进程启动,也可在其它窗口中嵌入单流 StreamMonitor 面板。

15 - 序列编辑器

实验代码编辑与序列模拟:语法高亮、解析与输出通道时序可视化。

概述

quatm/GUI/editors/editor_sequencer.py 提供 编辑并模拟 工具(旧称 Combi / “打开模拟窗口”):CodeEditorParser 组合主窗口把左侧 CodeEditor 代码编辑器 与右侧序列可视化组合起来:编辑实验脚本后可一键模拟运行,把各输出通道的时序画 成阶梯图,便于调试实验序列。

组件

组件说明
CodeEditor简易代码编辑器:行号、Python 高亮、自动缩进与补全
PythonHighlighter轻量 Python 语法高亮器
LineNumberArea编辑器左侧行号边距控件
ExperimentParser解析实验:buildExperiment / simulateExperiment 返回命令栈
ExperimentSequencer把序列按各输出通道随时间画成阶梯图
CodeEditorParser组合主窗口:Save / Simulate / Clear 工具栏 + Dock 布局

关键方法

方法说明
saveFile(CodeEditor)把当前文本保存到文件(成功返回 True)
simulateExperiment(CodeEditorParser)模拟当前版本实验并把命令栈交给序列可视化
buildExperiment / simulateExperiment(ExperimentParser)构建 / 模拟运行实验并返回命令栈
plotSequence(ExperimentSequencer)把序列字典画成各通道时序阶梯图

用法

from quatm.GUI.editors.editor_sequencer import CodeEditorParser

win = CodeEditorParser(parent=parent, filename="experiments/my_experiment.py")

说明:参数扫描(nD 扫描、随机化等)的编辑入口在实验窗口的 Edit 按钮 (SequenceEditor,见实验窗口),扫描定义保存于 实验属性树并与远程控制平台共享。

16 - 进程管理器

分布式进程面板:按 Servers/Driver/GUI/Viewer/Monitor 分类启停后台进程。

概述

quatm/GUI/entries/processmanager.py 提供 进程管理器:按 Servers / Driver / GUI / Viewer / Monitor 分类读取配置,为每个脚本条目生成一个 SingleProcess 启停按钮面板,统一管理整套实验软件的运行。进程以当前解释器按脚本或模块(python -m)方式启动,携带项目根与父进程看门狗环境。

进程类别

类别说明典型进程
Servers通信 / 属性 / 数据服务数据中心、属性服务等
Driver硬件驱动进程FPGA 等设备驱动
GUI图形界面进程实验浏览器、数据管理器等
Viewer数据查看进程实时绘图、滚动窗口、图像查看器等
Monitor监控 / 检查进程属性检查器、消息监控等

组件

组件说明
ProcessManager分类面板:读取配置为每个条目生成启停按钮
SingleProcess单条目面板:启动/异步终止/状态轮询着色
resolve_script把配置里的 script 条目解析为启动目标(文件路径或模块)

关键方法(SingleProcess)

方法说明
startProcess停掉旧实例后以当前解释器启动子进程
stopProcess异步终止子进程,不阻塞 GUI 线程
updateStatus周期轮询退出状态并着色(运行中/正常退出/崩溃)

用法

from quatm.GUI.entries.processmanager import ProcessManager

pm = ProcessManager(parent=parent)
pm.show()

待管理条目由配置文件中的 scripts 定义;各条目的启动/停止通过对应的按钮面板完成。

17 - 设备管理器

PyVISA 设备发现与驱动绑定:枚举、查询、选择仪器并关联驱动文件。

概述

quatm/GUI/entries/device_manager.py 提供 设备管理器(VISADeviceLister):通 过 PyVISA 扫描系统中的 VISA 仪器,查询设备标识(*IDN?)并选择驱动文件绑定, 把设备加入已选列表生成 DeviceInfo,供设备配置使用。

组件

组件说明
VISADeviceListerVISA 设备列表工具:左右两栏(枚举/查询 + 已选设备/驱动文件)
DeviceInfo设备描述:名称、类型、驱动文件与附加参数

工作流

1. refresh_devices()      → 扫描 VISA 总线,填充设备列表
2. query_device_info()    → 对选中设备发送 *IDN? 查询
3. select_driver_file()   → 选取并绑定驱动文件
4. add_device_to_selected() → 加入已选设备列表(去重)

用法

from quatm.GUI.entries.device_manager import VISADeviceLister

dl = VISADeviceLister(parent=parent)
dl.refresh_devices()   # 列表显示 USB/GPIB/LAN 等 VISA 设备

18 - 数据存储

HDF5 数据管理:订阅、定时/手动保存与历史回读,含绘图一体化面板。

概述

quatm/GUI/h5storage/ 提供 HDF5 数据存储 GUI(由旧单文件拆出的包,公开符号在 包级再导出):汇总 / 单流 / 图像三类数据管理器订阅数据,按预约时刻、周期或 Looper 指令自动保存,也可手动把当前快照后台写入 .h5 文件并从文件回读历史测量 。

组件

组件模块说明
H5StorageGuimain_window.py主窗口:数据标签页、保存/定时保存控件与 plot 管理
H5StorageDataMgrdata_manager.py三类数据管理器宿主:订阅管理、保存/回读、清空
H5SaveWorkerworkers.py工作线程写 .h5,磁盘 I/O 不阻塞 Qt 事件循环
H5DataPlotter / EventPlotterplotters.py测量数据 / 事件数据的绘图标签页
XAxisWidget / YAxisWidgetaxes.pyx 轴与各 y 轴的数据选择、过滤链配置
BinningWidget / FilterWidget / FittingWidgetwidgets.py / fitting.pybinning、过滤与 ODR 拟合处理链

保存方式(H5StorageDataMgr)

方法说明
toggle_scheduled_save开关预约时刻保存(到时自动保存并提示)
toggle_regular_save开关每 N 小时的周期自动保存
scheduled_save_by_looper响应 Looper 的保存指令(final / intermittent)
savetoFile把当前数据快照后台写入 .h5 文件
loadFromFile从既有 .h5 文件加载历史测量并刷新界面
selectDatadir自选 h5 目标文件(避免回滚到每日默认名)
clear清空三类数据管理器的全部缓存

用法

from quatm.GUI.h5storage import H5StorageGui   # 包级再导出

win = H5StorageGui(parent=parent)
win.show()

数据保存由后台 H5SaveWorker 完成:GUI 线程先拷贝数据快照再交给 worker,因此 HDF5 磁盘写入不会卡住界面。

19 - 实时滚动图

实时滚动绘图:环形缓冲、滑动平均与数据流订阅。

概述

quatm/GUI/entries/live_plot.py 提供 实时滚动绘图ScrollWindow 为多子图主 窗口,每个 ScrollPlot 子图订阅一条数据流的若干通道,维护环形缓冲并滚动显示散 点/曲线与滑动平均;PlotDataEditor 提供数据源下拉面板。

组件

组件说明
ScrollWindow多子图滚动主窗口:按属性恢复/新建子图,工具条可追加子图
ScrollPlot滚动子图:环形缓冲、散点与滑动平均曲线,右键菜单操作
PlotDataEditor数据源选择面板:下拉候选并写回属性/父图

关键方法(ScrollPlot)

方法说明
feedData把新数据块压入缓冲数组
setnewData定时拉取新数据喂给缓冲并刷新曲线
updatePlot把缓冲内有效数据刷到散点与滑动平均曲线
running_mean用累积和差分高效计算 N 点滑动平均
dataSelectDialog选择本图显示的数据通道
subscribe_window打开订阅编辑器重新订阅数据流
configureWindow暂停刷新,内嵌属性编辑修改本图属性
deletePlot从父窗口移除本图并清除属性

用法

from quatm.GUI.entries.live_plot import ScrollWindow

host = ScrollWindow(name="PMT 滚动监视", parent=parent)
host.addPlot()   # 追加一个滚动子图

之后在子图右键菜单中订阅数据流、选择通道并调整显示。缓冲长度、滑动平均开关与 窗口大小等配置保存在属性中,重启后自动恢复。

20 - 自动保存编辑器

自动保存时间点列表编辑器:配置一组(勾选 + 日期时间)的周期保存时刻。

概述

AutoSaveEditorquatm/GUI/editors/auto_save_editor.py)是一个弹窗编辑器,用来 维护 周期 h5 自动保存 的“时间点列表”:每一行 = 一个(勾选标记 + 日期时间),勾选 的行会按对应时刻触发一次自动保存。它由数据存储相关面板调用。

组件

组件说明
AutoSaveEditor编辑列表的对话框:加载/写回属性、每行增删改、确认(Accept)
DateTimeWidget单条自动保存时间的编辑行:序号 + 勾选框 + 日期时间选择

主要方法

方法功能
load_AutoSaveEditor_props(props, prop_name)从属性读取已保存的日期时间与勾选标记,补齐到最大条目数
update_datetime(idx, datetime_save)保存某一行的新日期时间
update_ticked(idx, ticked)保存某一行的勾选状态
accept()确认:把列表写回属性并关闭

用法

from quatm.GUI.editors.auto_save_editor import AutoSaveEditor

editor = AutoSaveEditor(props=props, max_items=24, parent=parent)
editor.load_AutoSaveEditor_props(props, "H5Storage/auto_save_times")

21 - 实验辅助工具

光镊对准、杂散场补偿:实验自动化校准与优化工具集。

概述

Quatm 将日常实验校准任务封装为对准/辅助工具,模块位于 quatm/GUI/alignment/, 配以若干独立入口控件,实现一键运行与自动优化。


ODT 对准辅助 — OdtAlignmentHelper

quatm/GUI/alignment/odt_helper.py — 对 xODT/cODT 各压电镜轴建单轴控制块,提供 整体运行/终止与补偿电压、BA 激光参数设置。每轴完整对准序列为:激光关的全范围扫 描 → 离子附近精细扫描 → 发布拟合结果 → 移到目标位置。

from quatm.GUI.alignment.odt_helper import OdtAlignmentHelper

helper = OdtAlignmentHelper(parent=parent)
helper.run_all()   # 执行完整对准流程(线程池保证逐轴进行)
helper.terminate_all()   # 安全停止全部轴

杂散场补偿 — CompensationHelper

quatm/GUI/alignment/comp_helper.py — 通过沿各阱轴的电压扫描与两拟合线交点求补 偿电压,自动最小化杂散场。

组件说明
PlotWidget每个阱轴一个标签页的绘图控件
ControlWidget各轴控制区加共享参数区
SingleAxisWidget扫描参数与“找补偿电压”(求两拟合线交点)
CompVoltageScan在高低两个 rf 约束上执行电压扫描
from quatm.GUI.alignment.comp_helper import CompensationHelper

comp = CompensationHelper(parent=parent)

压电镜控制 — PiezoMirrorControl

quatm/GUI/entries/piezo_mirror_controler.py — 用箭头/按键界面操纵直线促动器反 射镜方向的简易面板,W/A/S/D 对应上/左/下/右。

from quatm.GUI.entries.piezo_mirror_controler import PiezoMirrorControl

mirror = PiezoMirrorControl()   # 独立窗口;WASD 或点击方向键控制
mirror.show()

22 - 数据模型

DictSyncModel/ListSyncModel:将 Python 字典/列表自动映射为 Qt 表格。

概述

quatm/GUI/widgets/models.py 提供把 Python 字典 / 列表映射为 Qt 表格模型的基类(源自 ARTIQ 的 models)。实验队列、准备台与循环器的表格界面均基于此构建。

核心类

说明
_SyncSubstruct包装底层容器的字典操作辅助:append/insert/pop 后触发刷新回调
DictSyncModel字典→表格模型基类:按 headers/dataNames 列映射 backing_store
ListSyncModel列表→表格模型基类(底层为列表)
ScheduleModel实验队列(ExperimentQueue)模型:任务按优先级再按任务号排序
PrepModel准备台 / 循环器模型:底层为列表,顺序可自由调整

用法

from quatm.GUI.widgets.models import DictSyncModel

model = DictSyncModel(
    headers=["名称", "值", "单位"],
    dataNames=["name", "value", "unit"],
    init={"name": "param1", "value": 100, "unit": "µs"},
)

具体业务模型通过子类实现三个钩子定制行为:convert 把键/值/列转成单元格内容,sort_key 返回排序键,flags 决定各单元格可编辑等标志。

23 - 可折叠组件

CollapsibleDialog:可折叠/展开的树形对话框。

概述

quatm/GUI/widgets/theexpandables.py 提供可折叠/展开的树形对话框 CollapsibleDialog: 每个“面板”由一个带展开/折叠按钮的树条目与一个内容控件组成,适合配置界面与高级参数设置。

组件

组件说明
SectionExpandButton可展开/折叠某个 section 的按钮
CollapsibleDialog对话框容器;子类覆写 define_sections() 定义全部面板

CollapsibleDialog 提供 add_section(title, widget) 直接添加面板;子类也可覆写 define_sections()add_button / add_widget 细粒度组织树形结构。

用法

from quatm.GUI.widgets.theexpandables import CollapsibleDialog

class SetupDialog(CollapsibleDialog):
    def define_sections(self):
        self.add_section("相机设置", some_widget)
        self.add_section("触发设置", trigger_widget)

24 - 参数框

与实验参数绑定的输入控件:浮点、布尔与下拉参数框,改动即写回参数。

概述

quatm/GUI/widgets/arg_boxes.py 提供把实验参数类与 Qt 输入控件绑定的小部件: 用户改值即回写实验参数(内部以 SI 单位存储,界面可按需换算显示)。它们常由 “实验参数面板/参数系统”按参数类型自动创建。

控件

控件参数类型说明
FloatBox数值参数浮点输入框;用 unitdisplay_multiplier 做单位换算后写回
BoolBox布尔参数勾选框,值以布尔形式写回
ComboBox字符串列表下拉框,按选中下标从字符串列表取值

用法(示意)

from quatm.GUI.widgets.arg_boxes import FloatBox, BoolBox, ComboBox

# 数值参数:界面按 kHz 显示,底层以 SI(Hz)存储
fbox = FloatBox(argument=param_freq, unit="kHz", display_multiplier=1e3)

bcheck = BoolBox(parName="enable", value=param_enable)
cbox = ComboBox(parName="source", argument=param_source)  # 参数类内含 stringlist

通常这些控件由参数系统按实验声明自动生成,无需手工实例化。

25 - 实验参数面板

DefaultExp + Dashboard:从设备数据库自动构建的整机参数控制面板。

概述

Dashboardquatm/GUI/entries/dashboard.py)是由 默认实验(DefaultExp) 驱动的“控制面板”主部件:DefaultExp 按设备数据库自动装配整机参数,Dashboard 再把这些参数按 整数/浮点/布尔 分段、以分组网格排布成可调的参数控制界面。

类体系

DefaultExp(实验基类:自动装配设备属性并分组)
     └─ Dashboard(控制面板:分段 + 分组网格 + 自适应列数)
            └─ 管理器控件(IntManager / FloatManager / BoolManager / ComboManager …)

关键特性

  • 自动装配DefaultExp.build() 遍历设备库,为每个 attr/generic_attr 设备 建立参数对象并按其分组归类。
  • 按类型分段:界面按 整数 / 浮点 / 布尔 等类型分段,段内再按参数分组。
  • 自适应列数adaptive_columns() 依据窗口宽度重排(4 列起,每约 200 px 加一列), 窄窗口也不挤压。
  • 就地生效:改动微调框即写回属性并直达硬件(运行体 run() 为空,适合纯手动调参)。

用法(示意)

from quatm.GUI.entries.dashboard import Dashboard, DefaultExp

# DefaultExp 自动装配设备参数;Dashboard 负责界面排布与分组
page = Dashboard(parent=parent)

“参数系统”页描述了其内部的管理器控件体系。

26 - FPGA DAC 控制

FPGA 的简易手动控制界面:16 路 DAC 电压与 32 路 TTL 位掩码设置。

概述

quatm/GUI/entries/fpga_controller.py 提供用于调试与校准的 FPGA 简易手动控制: 用带标签的 -10 … +10 V 数值框逐路设置 DAC 电压,用勾选框网格设置 32 路 TTL 输出。

组件

组件说明
dacv(v)-10..+10 V 换算为 FPGA 使用的 16 位原始 DAC 码
DACsingle单个 DAC 通道:带标签的 -10..+10 V 数值框,写入即生效
DACvalues纵向堆叠的全部 16 个 DAC 通道
TTLQW32 路 TTL 输出:8×4 勾选框网格,整体作为一个 32 位掩码写入
simple_pageDAC + TTL 手动控制页面
centralWidget / mainQMW标签容器与简易主窗口(含 File/退出菜单)

用法

from quatm.GUI.entries.fpga_controller import DACvalues, TTLQW

# 先经设备数据库取得底层 FPGA 驱动句柄 controller
page = DACvalues(controller)

# TTL:勾选框状态经“Apply/状态变化”回调合成掩码写入 FPGA
ttl = TTLQW(controller)

硬件缺失或写入失败时只打印错误、不崩溃,便于无硬件环境下的界面调试。

27 - 后台工作线程

Worker/WorkerSignals:通用 QRunnable 后台线程封装。

概述

quatm/GUI/widgets/browser_workers.pyhelper_workers.py 提供基于 QRunnable 的通用后台线程封装:把耗时任务放到线程池执行,并经信号把结果/异常/进度传回界面线程。

信号

信号说明
finished任务完成(无数据)
error(tuple)(异常类型, 值, traceback 字符串)
result(object)处理返回的结果,任意类型
progress(int)进度百分比

用法

from quatm.GUI.widgets.browser_workers import Worker

worker = Worker(callback=my_long_task, arg1, kw=...)   # 透传给回调函数
worker.signals.finished.connect(on_done)
worker.signals.error.connect(on_error)
QThreadPool.globalInstance().start(worker)

两处实现大同小异:helper_workers.py 供辅助/分析类后台任务复用,browser_workers.py 供浏览器类面板复用。

28 - 实验时间线

FPGA 实验时序可视化:DAC 与 TTL 输出通道随时间变化的图表查看器。

概述

quatm/GUI/entries/experiment_timeline.py 提供 实验时间线(Timeline):加载 实验时序 JSON 文件(experiment.json),把各 DAC/TTL 输出通道随时间的变化绘制成 阶梯子图,并提供输出通道勾选面板决定哪些曲线可见,方便调试与验证实验时序逻辑。

组件

组件说明
Timeline时序查看主窗口:加载文件、绘图与通道控制
TimelinePlotter时序可视化控件:随时间绘制每个在用输出的状态
SelectorWidget输出通道勾选面板:全选 / 全不选决定可见曲线

关键方法(Timeline)

方法说明
load_file加载并解析时序 JSON,构造时间序列并刷新通道选择器
plot_experimental_sequence按通道勾选状态为每个输出建独立子图并绘阶梯图
decode_ttl_bitmask把 32 位 TTL 位掩码拆成各通道的 set/clear 命令
construct_time_sequences把步骤式时序转成按通道组织的 times/vals 序列
reverse_device_db_transformation设备库反变换:内部名映射回可读名(含 gauge 校准表)

用法

from quatm.GUI.entries.experiment_timeline import Timeline

tl = Timeline()
tl.load_file("experiment.json")   # 加载时序文件并绘图
tl.show()

29 - 滚动波形窗口

多通道实时滚动数据查看窗口:子图缓冲、数据流订阅与动态刷新。

概述

quatm/GUI/entries/scrollwindow.py 提供 滚动波形窗口(ScrollWindow)BMainWindow 子类的多通道实时滚动数据查看主窗口,按指定数量排布 ScrollPlot 子图(每两个换一行),统一把数据块分发到对应子图并刷新;PlotDataEditor 提供 数据/图像流的选择下拉。

组件

组件说明
ScrollWindow主窗口:按数量创建子图、分发数据并刷新
ScrollPlot滚动子图:订阅数据流,环形缓冲 + 定时刷新
PlotDataEditor数据源选择面板:下拉候选并写回属性 ydata

关键方法

方法说明
initPlots按数量创建滚动子图并排入布局(每两个一行)
feedData把新数据块喂给缓冲数据数组
updatePlot把缓冲中已填充区间批量刷新到各子图曲线
setnewData(ScrollPlot)定时器驱动拉取数据并刷新曲线
dataSelectDialog(ScrollPlot)弹出对话框选择要绘制的数据通道
subscribe_window(ScrollPlot)弹出订阅编辑器更换数据流
configureWindow(ScrollPlot)暂停刷新并内嵌属性编辑修改本图配置

用法

from quatm.GUI.entries.scrollwindow import ScrollWindow

win = ScrollWindow(name="PMT 滚动监视", parent=parent, n_plots=2)

在每个子图上通过右键菜单完成数据流订阅、数据通道选择与显示配置;该窗口也可作为 独立进程启动。

30 - 订阅编辑器

管理数据/图像流的订阅列表:添加、删除与热更新已订阅的数据源。

概述

SubscriptionEditorquatm/GUI/editors/subscription_editor.py)管理程序对数据流/ 图像流的订阅:从属性库加载已存订阅、列出可用流供选择,支持添加/删除,并在属性变更 时热更新列表。它常作为实时绘图/监视类面板的数据源选择组件。

主要方法

方法功能
loadSubscriptions()从属性库读取已保存的订阅并载入列表
update_streamlist()按当前可用数据流重建下拉候选
add()把下拉框选中的流加入订阅列表并同步属性
deletemarked()移除列表中被标记删除的订阅项并同步属性
handle_property_changes(changes)监听属性变更,刷新列表并广播

用法

from quatm.GUI.editors.subscription_editor import SubscriptionEditor

editor = SubscriptionEditor(props=props, category="Data", parent=parent)
editor.loadSubscriptions()

31 - 表格参数

基于 QTableWidget 的 numpy 结构化数组编辑器,用于参数树。

概述

quatm/GUI/widgets/table_parameter.py 提供 ParameterTree 的表格编辑 节点:table_parameter 参数类型配合 table_parameterItem 控件项,可在参数树中直接 编辑 numpy 结构化数组(如校准表、扫描序列)。

组件

组件说明
table_parameter参数类型:接受一个 numpy 结构化数组作为 value
table_parameterItem对应控件项:按数组 dtype 创建 QTableWidget 作为编辑器

table_parameterItem 会按数组 dtype 建列(含字段名/类型),单元格改动即时回写数组; valueIsDefault() 用于判断是否需要单独持久化该值。

用法

from quatm.GUI.widgets.table_parameter import table_parameter
import numpy as np

dt = np.dtype([("freq", float), ("amp", float)])
param = table_parameter(name="扫描表", value=np.zeros(10, dtype=dt))

32 - 远程 ROI

通过中心属性库发布颜色/位置/尺寸、可远程同步的 ROI 组件。

概述

quatm/GUI/widgets/ROI.py 提供 ROI:继承 ROI,以唯一名称 通过中心属性库通信其颜色、位置与尺寸,使远程客户端能同步查看与调整 ROI 区域。

方法

方法说明
update_from_properties按属性里的颜色/位置/尺寸刷新 ROI 画笔颜色与几何形状

用法

from quatm.GUI.widgets.ROI import ROI

roi = ROI(name="分析区域", parent=view)   # name 需唯一,重名会共享属性
roi.update_from_properties()

说明:name 是该 ROI 在中心属性库中的键,务必确保不与属性字典中的任何名字冲 突;属性变化后调用 update_from_properties 即同步刷新 ROI 外观与位置。

33 - 图像查看器

科学图像查看主窗口:中央图像显示器加行/列线剖面与直方图色标停靠面板。

概述

quatm/GUI/entries/image_group.py 提供 图像查看窗口(ImageWindow):以中央 ImageDisplay 图像显示器为主控件,四周停靠 行/列线剖面直方图色标 等面 板,用于成像实验的实时监视与分析。

布局结构

停靠区控件用途
中央ImageDisplay订阅并自动刷新图像流,可叠加掩码
顶部LivePlot(行剖面)图像行的强度分布曲线
右侧LivePlot(列剖面)图像列的强度分布曲线
左侧HistogramLUTWidget直方图色标:电平范围与伪彩色映射

其中每个剖面图是一个 LivePlot 容器,内部由 UpdatingPlot 订阅对应数据流实时 刷新(详见实时绘图)。

显示参数持久化

显示参数存放在属性库 Viewer/ 命名空间下,构造时按属性恢复,关闭时自动保存:

属性含义
Viewer/minlevels / Viewer/maxlevels直方图显示电平范围
Viewer/gradient伪彩色渐变预设(如 magma)
Viewer/tick_position色标刻度位置(0–1 归一化列表)

拖动直方图电平或色标刻度后,分别经 update_min_maxget_tick_position 把当 前值写回属性,closeEvent 在关闭前统一保存视图范围与刻度。

方法

方法说明
update_min_max把直方图当前电平范围写回属性(min/max levels)
get_tick_position遍历色标刻度并归一化到 0–1 区间返回
closeEvent关闭前把视图范围与色标刻度保存到属性

用法

from quatm.GUI.entries.image_group import ImageWindow

win = ImageWindow(name="吸收成像")   # 独立主窗口,parent 可省略
win.show()

该窗口常作为独立进程启动,也可作为 BMainWindow 实例嵌入其它界面。图像流与 行/列剖面流的订阅,在各子面板(图像显示器 / 剖面图)的右键菜单中完成。

34 - 属性检查器

属性分发看门狗:验证 Properties 中枢确实在广播更新。

概述

PropertiesCheckerquatm/GUI/entries/properties_checker.py)是一个属性分发 看门狗:它通过一个属性句柄设置标记,再用第二个句柄读回;若中枢没有把该变化传播 过来,就弹出告警,说明属性服务可能已停摆。检查在定时器上周期运行,因此窗口正常 显示且界面事件循环保持响应。

用法

from quatm.GUI.entries.properties_checker import PropertiesChecker

checker = PropertiesChecker(parent=parent)
checker.check_once()   # 手动执行一次看门狗检查

面板自身会周期调用 check_once()(每次把标记置真再置假并读回验证)。

35 - 辅助绘图

通用测量数据绘图组件:数据源/多 y 轴、过滤、分箱与拟合。

概述

quatm/GUI/alignment/plotter.py 提供 辅助绘图(DataPlotterWidget):订阅并绘 制测量过程中采集的数据。支持数据源切换、x 轴与多个 y 轴选择器,每个 y 轴经一条 可配置的数据链(缩放系数 → 过滤器 → 分箱/拟合)处理后画入图区,并可导出 PDF。

组件

组件说明
DataPlotterWidget主绘图:数据源下拉、x 轴选择器、若干 y 轴选择器(右键开关配置面板)
YAxisWidgetHelpery 轴数据链:缩放系数、过滤器、分箱与拟合处理

关键方法

方法说明
setDataSource设置或更换数据源
checkForNewData / updateDatasources检查新增数据/新数据源并刷新
plotData把一组 x/y 数据作为新曲线加入图区
toggleConfig切换数据源与 y 轴配置面板显示
exportpdf把当前绘制导出为适合归档的 PDF
clear清空数据汇总与图区全部曲线

Y 轴链(YAxisWidgetHelper):updateYscale 设置缩放系数,右键菜单可 addBinning 分箱、addFitting 拟合(如高斯/线性),reevaluateData 在过滤器等 变化后重跑整条数据链。

用法

from quatm.GUI.alignment.plotter import DataPlotterWidget

plotter = DataPlotterWidget(
    axis_name="myaxis",
    prop_root="...",
    datastream_names=[".../data"],
    n_yaxis=1,
    parent=parent,
)
plotter.toggleConfig()   # 展开数据源 / x、y 轴选择配置