实验任务预备队列管理器

该代码定义了几个自定义的GUI控件类,包括基础窗口小部件、框架、主窗口以及带有自动完成功能的组合框和自定义的文本编辑控件。这些控件通过继承PyQt6的基本控件类,并添加了一些自定义的功能来实现。

概要

该代码定义了用于管理和展示队列(Queue)和准备站(PrepStation)表格的模型。模型指定了表格数据的形式(如字典或列表),以及如何展示和操作这些数据,包括如何获取、设置和删除数据,以及如何排序数据。模型可以直接从数据集中读取数据,并在数据集发生更改时自动更新表格。

主要类和功能

_SyncSubstruct

此类定义了用于操作表格数据字典的方法。方法包括添加、插入、弹出、设置、删除和获取字典项。这个类主要是为了便于在模型中更新数据字典,并在数据更新时调用回调函数来通知模型。

DictSyncModel

这是一个基类,用于将字典(backing_store)转换为表格。模型可以读取和编辑字典中的数据,并根据需要更新表格显示。其主要功能包括:

  • 初始化模型,设置表头、数据名称和初始数据。
  • 获取行数和列数。
  • 获取和设置单元格数据。
  • 获取表头数据。
  • 插入和删除字典项。
  • 排序和转换数据。
关键方法
  • rowCount: 返回字典中的条目数。
  • columnCount: 返回列的数量,即表头的数量。
  • data: 根据索引和角色获取数据。
  • setData: 设置单元格数据,并根据需要进行类型转换。
  • headerData: 获取表头数据。
  • __setitem__: 插入或更新字典项,并更新表格显示。
  • __delitem__: 删除字典项,并更新表格显示。
  • __getitem__: 获取字典项。
  • sort_key: 定义排序键(由子类实现)。
  • convert: 将字典键转换为列数据(由子类实现)。
  • flags: 定义单元格的属性(由子类实现)。

ScheduleModel

这是用于管理实验队列的表格模型。数据结构是一个字典,每个字典代表一个实验任务。任务按优先级和任务编号排序。

关键方法
  • sort_key: 返回用于排序的键,首先按优先级排序,然后按任务编号排序。
  • convert: 将字典键转换为列数据,特别是将日期时间字符串转换为 QDateTime 对象。
  • flags: 定义可编辑和不可编辑的列。

ListSyncModel

类似于 DictSyncModel,但处理的是列表而不是字典。主要用于管理需要按顺序排列的数据集合。

关键方法
  • rowCount: 返回列表的长度。
  • columnCount: 返回列的数量。
  • data: 根据索引和角色获取数据。
  • setData: 设置单元格数据,并根据需要进行类型转换。
  • headerData: 获取表头数据。
  • __delitem__: 删除列表项,并更新表格显示。
  • __getitem__: 获取列表项。
  • sort_key: 定义排序键(由子类实现)。
  • convert: 将列表项转换为列数据(由子类实现)。
  • flags: 定义单元格的属性(由子类实现)。

PrepModel

这是用于准备站的表格模型,使用列表来管理任务,因为准备站中的任务不需要唯一的 ID,可以自由更改顺序。

关键方法
  • convert: 将列表项转换为列数据,特别是将日期时间字符串转换为 QDateTime 对象。
  • flags: 定义可编辑和不可编辑的列。

功能特点

  • 数据同步:模型可以同步更新数据字典或列表,并通知表格更新显示。
  • 数据排序:模型可以根据指定的键对数据进行排序。
  • 数据转换:模型可以根据列索引转换数据类型,如将日期时间字符串转换为 QDateTime 对象。
  • 数据编辑:模型支持在表格中编辑数据,并将更改反映到原始数据集合中。
  • 表格属性:模型可以定义哪些列是可编辑的,哪些是只读的。

运行流程

  1. 创建模型实例,传入初始数据。
  2. 模型通过 rowCountcolumnCount 方法告知表格数据的大小。
  3. 表格通过 data 方法获取单元格数据并显示。
  4. 当用户编辑表格时,模型通过 setData 方法更新数据集合。
  5. 模型通过发射信号通知表格数据已更改,表格自动更新显示。