qt 小程序 开发进展
目前的程序虽然实现了功能,但是相当混乱,感觉是因为代码没有按照规范编写,而且大量使用低级低效的语法。
梳理一下程序的逻辑
初始化
- 初始化 ui
- 包括布局,文本框,菜单栏
- 加载历史 prompt
- 实例化 QNetworkAccessManager 等变量
- 读取本地保存的 api 相关数据
- 设定状态变量初始值
启动绘图进程
需要有状态变量记录当前状态 是 sd 还是 comfyUI 还是别的什么
如果是 sd
(一次 post 请求完成绘图)
- 连接 发送请求 和 按下按钮
- 连接 QNetworkAccessManager::finished(响应事件)和 显示图片
过程:
- 按下按钮
- 发送请求 方法
- 收到响应
- 处理响应 方法
- 显示图片 方法
这个过程中,用到了三个方法:
- 发送请求
- 输入:
- 需要发送的 prompt 文本
- 标题
- 输入:
- 处理响应
- 输入:
- 图片信息(prompt, 标题,之类的)
- json 响应
- 解码 json 响应
- 从 json 中提取图片数据
- 转化为二进制流的形式发送给显示图片的方法
- 输入:
- 显示图片
- 输入:
- 图片
- 设置控件
- 绘制图片
- 打开图片窗口
- 输入:
如果是 comfyUI
(多步流程)
- 连接 发送请求 和 按下按钮
- 连接 http 网络响应 和 处理网络响应的方法
- 连接 websocket 网络响应 和 处理网络请求的方法
过程:
- 按下按钮
- 发送提交任务 http 请求 方法
- websocket 收到特定响应
- 发送获取文件名 http 请求 方法
- 收到响应 文件名
- 发送获取图片 http 请求 方法
- 收到响应 图片数据
- 显示图片 方法
使用到的方法:
- 发送 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-小程序-开发进展/