Skip to content
howdy213Public

About

基于 Qt 与 WECore 插件框架的多功能抽取工具

Resources

Stars

1 star

Watchers

0 watching

Forks

Latest commit

 

History

1 Commit

Folders and files

Repository files navigation

Sortition

基于 **Qt 6 + WECore 插件框架 **的抽签 / 抽取桌面应用。

Sortition 以「主插件 + 功能插件」的形态运行在 WidgetExplorer 宿主中,提供名单与权重管理、人员抽取、奖品抽取、分份数、历史记录等完整功能,并支持 主界面 / 小窗 / 悬浮球 三种窗口形态。

✨ 主要功能

抽取人员

  • 两种基础模式(互斥,由左栏下拉切换)
    • 随机:从名单中随机抽取指定人数。
    • 公平:每人中签一次后才进入下一轮(轮次去重),本轮已抽中的人不再参与,全部抽中后自动开始新一轮;轮次进度随会话持久化,重启可恢复。
  • 两个可叠加开关(与基础模式正交,不再是独立模式)
    • 加权:按 最终权重 = 基准权重 × 动态公平权重 抽取。随机模式下即按权重抽取;公平模式下在本轮剩余人选中按权重选取。
    • 分组:仅影响结果呈现,把结果按「每组人数」分块。组数 = ceil(抽取人数 / 每组人数),最后一组为多出来的人组成的不足额小组,不丢弃余数。
  • 两个附加参数
    • 动态衰减(加权时生效):开启为动态权重 基准权重 × 1/(1 + 累计中签次数),中签越多权重越低;关闭则为固定权重,只用基准权重。
    • 有放回:允许同一批次内同一人重复中签,抽取人数上限随之放宽。仅对随机(含加权)生效,公平模式本身去重、会忽略该开关。
  • 参数可见:参数区顶部显示「当前使用:随机 / 公平 / 固定权重 / 动态权重」;高级视图底部的权重明细表列出 姓名 / 基准权重 / 累计中签 / 动态权重 / 最终权重,表头「清空」可把累计中签次数归零。
  • 会话(Session):每个会话绑定名单、模式与参数(模式 / 人数 / 加权 / 分组 / 每组人数 / 有放回 / 动态衰减),独立持久化。多会话以标签页并存,支持新建 / 复制 / 打开 / 保存 / 关闭 / 置顶;启动时恢复上次打开的全部会话并激活上次使用的那个。
  • 视图模式:简洁(仅结果)/ 正常(+ 名单栏)/ 高级(+ 历史、统计与权重明细),作为会话偏好持久化。

名单与权重

  • 名单档案独立于会话,可被多个会话引用;表格四列编辑「姓名 / 分组 / 权重(基准权重)」,支持批量文本录入。
  • 未保存修改有独立标记,切换档案 / 新建 / 保存前会二次确认,避免静默丢弃编辑。
  • 支持新建 / 删除名单,以及在会话内切换绑定名单(切换会重置该会话的公平轮次与累计中签次数)。

抽取奖品

  • 奖品清单(模板库):四列表格「名称 / 权重 / 初始库存 / 本次剩余」,支持多份清单的切换、新建、删除与「另存为模板库」(以当前副本另存为新清单,不覆盖原清单)。
  • 本次库存与模板库分离:抽取只在内存副本「本次剩余」上扣减,绝不回写模板库,避免误操作改动库存;提供「重置库存」把副本恢复为初始库存。
  • 可指定中奖者来源名单(默认当前会话名单,可切换其他名单或「不使用名单」),结果与历史记录来源名单。

分份数

把总数拆分为若干份,结果均为最小单位的整数倍:

  • 平均:份数固定,每份尽量均等(余数分摊到前几份)。
  • 随机:每份在 [最小, 最大] 区间内随机,各份之和等于总数(生成后整体打乱)。
  • 可绑定名单,此时份数固定为名单人数,做「按人分份」。

历史

  • 总历史记录(侧边栏「历史」页):按批次聚合,同一批一条,最新批次排在最前;每条显示时间、所属会话、名单、模式与中签名单。
  • 会话内历史(高级视图底部):同一批次的聚合一览,与统计信息(总人数 / 累计批数 / 公平剩余)并列。
  • 清空:总历史一次性清空全部会话记录,操作前弹确认框(不可撤销);删除会话会连带清除该会话历史。
  • 历史只追加、不裁剪,任何批次都不会被后续抽取挤掉。

设置

内嵌在主窗口内容区第 6 页,由 WECore 的 WConfig 统一渲染,分为「抽取」「奖品」「分份」「启动与窗口」等分组。启动项(默认页面 / 主界面·小窗·悬浮球)也在其中配置。

窗口形态

  • 主界面 / 小窗(MiniWindow) / 悬浮球(FloatingBall) 三种形态互斥:进入小窗或悬浮球会隐藏主界面,返回时恢复。
  • 小窗为紧凑常驻置顶界面,可直接抽取并可一键关闭程序。
  • 悬浮球可拖动、位置持久化,点击后展示结果并在 5 秒后自动消隐。
  • 关闭主窗口即退出程序(宿主与其它插件不会阻止退出)。

🗃️ 数据与配置

所有软件数据文件统一放在插件数据目录 plugins/Sortition/data/:

文件 内容
sortition_store.json 名单档案 / 会话 / 奖品清单 / 历史记录
sortition_meta.json 非用户可见状态:窗口几何、上次会话与打开的会话、悬浮球位置、奖品页上次参数
config.json 本插件设置,挂在宿主共享设置界面上

🛠️ 构建

环境要求

  • Qt 6.11.2(QT += core gui widgets statemachine svg)
  • C++20(CONFIG += c++20)

构建步骤

  1. 用 Qt Creator 打开顶层工程 WidgetExplorer.pro
  2. 顶层为 TEMPLATE = subdirs + CONFIG += ordered,按依赖顺序构建:deps/WECore → deps/SortitionCore → plugins/Sortition → src/WidgetExplorer.pro。
  3. 构建产物(相对构建目录):
    • wecore / sortitioncore 输出到 src/{debug,release}/,供插件以 -lwecore -lsortitioncore 链接;
    • 插件 DLL 输出到 src/{debug,release}/plugins/Sortition/(SortitionMain.dll、PortionPlugin.dll);
    • 宿主可执行文件为 WidgetExplorer.exe。

增删 .pro 中的 SOURCES / HEADERS 后需重新执行 qmake,否则新增源文件不会参与编译。

运行

将 Qt 运行时(bin 目录)加入 PATH 后启动 WidgetExplorer.exe 即可。宿主会按 plugins/plugins.json 扫描并加载 Sortition 插件;插件元数据为其同目录下的 Sortition.json / Portion.json。

若上一次进程未正常退出,残留的单实例锁 we.lock 可能导致启动失败,删除该文件后重试。

📄 许可证

About

基于 Qt 与 WECore 插件框架的多功能抽取工具

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Contributors

Languages