qt 小程序 开发进展

目前的程序虽然实现了功能,但是相当混乱,感觉是因为代码没有按照规范编写,而且大量使用低级低效的语法。

梳理一下程序的逻辑

初始化

  • 初始化 ui
    • 包括布局,文本框,菜单栏
    • 加载历史 prompt
  • 实例化 QNetworkAccessManager 等变量
  • 读取本地保存的 api 相关数据
  • 设定状态变量初始值

启动绘图进程

需要有状态变量记录当前状态 是 sd 还是 comfyUI 还是别的什么

如果是 sd

(一次 post 请求完成绘图)

  • 连接 发送请求 和 按下按钮
  • 连接 QNetworkAccessManager::finished(响应事件)和 显示图片

过程:

  1. 按下按钮
  2. 发送请求 方法
  3. 收到响应
  4. 处理响应 方法
  5. 显示图片 方法

这个过程中,用到了三个方法:

  • 发送请求
    • 输入:
      • 需要发送的 prompt 文本
      • 标题
  • 处理响应
    • 输入:
      • 图片信息(prompt, 标题,之类的)
      • json 响应
    • 解码 json 响应
    • 从 json 中提取图片数据
    • 转化为二进制流的形式发送给显示图片的方法
  • 显示图片
    • 输入:
      • 图片
    • 设置控件
    • 绘制图片
    • 打开图片窗口

如果是 comfyUI

(多步流程)

  • 连接 发送请求 和 按下按钮
  • 连接 http 网络响应 和 处理网络响应的方法
  • 连接 websocket 网络响应 和 处理网络请求的方法

过程:

  1. 按下按钮
  2. 发送提交任务 http 请求 方法
  3. websocket 收到特定响应
  4. 发送获取文件名 http 请求 方法
  5. 收到响应 文件名
  6. 发送获取图片 http 请求 方法
  7. 收到响应 图片数据
  8. 显示图片 方法

使用到的方法:

  • 发送 http 请求
    • 提交任务
    • 获取文件名
    • 获取图片
  • 处理 websocket 响应
    • 如果是结束信号
    • 那么执行 发送 获取文件名 的 http 请求的方法
  • 显示图片

comfyUI 功能会使用的变量

  • QNetworkAccessManager m_httpNetworkManager
    • 统一的 http 请求管理器
    • 发送 http 请求的时候使用
  • QWebSocket m_webSocket
    • comfyUI 必不可少
    • 切换到 comfyUI 模式的时候建立链接
    • 如果断开,则试图重新连接
    • 如果连接成功,提示连接成功
    • 如果收到消息,判断是否是完成信号
      • 如果是,调用方法发送 http 请求,进行后续步骤
  • QQueue promptId 队列
    • 用来存储 prompt_id
    • 存在先后顺序,所以使用队列保存
    • qt 有现成的队列类 QQueue
  • QJsonObject imageInfo
    • 保存收到的图片相关数据
    • 包含文件名、路径等信息
  • ConnectionMode m_connectionMode
    • ConnectionMode 是一个枚举类
    • 用来记录当前的状态
    • 为什么不直接用字符串是因为我担心打错字

想要增加

  • 操作 UI 的方法
    • 目前都是直接 ui->xxx->settext 之类的
    • 业务逻辑与界面强耦合

存在的问题

模式

目前的话,是依靠一个 currentMode 变量识别现有的模式,问题在于发送请求接收到的时候不一定就是这个模式了。这种情况下,如果发送-接收请求中途变更了模式,那么就会出现问题。

“无状态” 这个术语可以形容 http 请求和响应没有内置关联机制。

大致想了一下关于这个问题的解决方法:

  • 有未完成的请求时,禁止变更模式
    • 最简单,比较有效,但是不是很灵活
    • 如果有请求因为错误没有完成,那么永远无法切换模式
      • 这种情况考虑添加一个手动清除请求等待队列的按钮
  • 通过响应本身判断是哪一种模式
    • 很复杂
    • 修改起来很麻烦
    • 可能存在有模式的响应无法和其他的区别开
  • 通过时间顺序判断
    • 否决,不一定是时间顺序一一对应
  • 使用 QNetworkAccessManager
    • 每个请求返回唯一的 QNetworkReply 对象
    • 通过信号槽机制绑定响应处理
    • 支持自定义数据附加到请求/响应对象
    • 可以使用 connect 将不同 QNetWorkReply 对象的 &QNetworkReply::finished 信号绑定到不同的方法
    • 也可以设置自定义的

设置界面

种子 和 client id 是该随机生成还是自定义?

目前的想法是提供一个可选的选项,选择是自定义固定种子还是随机生成。client id 同理。

这需要一个单独的设置界面,设置界面应当包括:

  • 种子
    • 设置随机/固定
      • 设置为固定时需要有一个文本输入框
      • 输入框在设置为随机时应当是 deactivte 的
  • client id
    • 设置随机/固定
    • 同理

seed 对于 comfyUI 和 sd 都适用, sd 没有 client id。

问题在于要不要把 comfyui 的 seed 和 sd 的 seed 分开来设置。


qt 小程序 开发进展
http://blog.wspdwzh.space/2025/03/03/qt-小程序-开发进展/
作者
peter?
发布于
2025年3月3日
许可协议