本文档详细描述了MarkRender应用中前端(JavaScript)与后端(Python)之间的通信接口规范,基于Qt的QWebChannel实现。
- 通信协议:QWebChannel
- 数据格式:JSON
- 核心通道:
window.bridge.channel(前端) 与BackendInterface(后端) - 文档隔离:所有通信均包含
item_id参数以支持多文档并发编辑
位于中的核心通信管理类,实现为单例模式。
-
register_web_handler(event_name, handler) 注册前端事件处理器
- 参数:
event_name(str) - 事件名称,handler(callable) - 处理函数
- 参数:
-
send_message(action, data, callback=None) 发送请求到前端
- 参数:
action(str) - 前端方法名,data(dict) - 请求数据,callback(callable) - 响应回调
- 参数:
-
unregister_document(item_id) 解除文档与通信通道的关联
- 参数:
item_id(str) - 文档唯一标识
- 参数:
- contentChanged:处理前端内容变更通知
- requestSave:处理前端保存请求
- reportError:处理前端错误报告
new QWebChannel(qt.webChannelTransport, function(channel) {
window.bridge = {
channel: channel.objects.document,
currentItemId: null
};
// 注册事件监听器
setupEventListeners();
});-
setDocumentId(item_id) 设置当前活动文档ID
- 参数:
item_id(str) - 文档唯一标识
- 参数:
-
sendContentChanged(content) 发送内容变更事件到后端
- 参数:
content(str) - Markdown内容 - 示例:
window.bridge.channel.contentChanged(window.bridge.currentItemId, content)
- 参数:
-
requestSave() 请求后端保存文档
- 示例:
window.bridge.channel.requestSave(window.bridge.currentItemId)
- 示例:
-
reportError(message) 向后端报告错误
- 参数:
message(str) - 错误信息 - 示例:
window.bridge.channel.reportError(message)
- 参数:
{
"success": true,
"data": {},
"error": null
}// 前端发送内容变更
editor.on('change', () => {
const content = editor.getValue();
window.bridge.channel.contentChanged(window.bridge.currentItemId, content);
});# 后端处理
@BackendInterface.register_web_handler('contentChanged')
def handle_content_changed(item_id, content):
document = MarkdownDocument.get(item_id)
document.set_content(content)
return {'status': 'received'}// 前端请求保存
function saveDocument() {
return new Promise((resolve) => {
window.bridge.channel.requestSave(window.bridge.currentItemId, (response) => {
resolve(response);
});
});
}# 后端处理保存
@BackendInterface.register_web_handler('requestSave')
def handle_request_save(item_id):
document = MarkdownDocument.get(item_id)
success = document.save()
return {'success': success}- 后端通过
_send_web_error()发送错误响应 - 前端通过
window.onerror捕获并报告错误 - 标准错误格式:
{
"success": false,
"data": null,
"error": {
"code": "ERROR_CODE",
"message": "Human readable error message"
}
}- 所有通信必须包含
item_id参数 - 切换文档时调用
setDocumentId()更新上下文 - 关闭文档时后端调用
unregister_document()清理资源
- 支持Qt WebChannel协议版本1.0+
- 所有异步操作使用回调或Promise处理
- 大文件传输建议使用分片机制