跳转到主要内容

悬浮窗开发

悬浮窗(overlay)是独立于主界面的小窗口,可拖拽、可最小化、可缩放。通常用于需要常驻的工具面板(如 AI 助手聊天窗)。

一、声明悬浮窗

在 manifest 中同时声明 contributes.menuItems(入口)和 contributes.overlay(悬浮窗配置):
要点:
  • menuItems[].action 必须为 "overlay",点击侧边栏按钮才打开悬浮窗(而非跳转页面)
  • overlay.file:悬浮窗 HTML 文件路径(.qplugin 内相对路径)
  • overlay.title 缺省取 menuItems[].label

二、编写悬浮窗 HTML

overlay.html 是一个完整 HTML 文档(自带 <html>/<head>/<body>),脚本可直接使用 .p-* 组件类和 window.__PLUGIN_API__。

悬浮窗环境特性

  • 自动注入 .p-* 组件样式 + 主题变量,跟随明暗主题
  • window.__PLUGIN_ID__ = 当前插件 id(悬浮窗内可用)
  • 支持 __PLUGIN_API__ 全部方法(含流式 proxyFetchStream)
  • 悬浮窗是沙箱 iframe(sandbox="allow-scripts"),脚本与主界面隔离
  • 标题栏由启动器渲染(标题、最小化、关闭按钮),你的 HTML 只负责内容区

悬浮窗内的开关控制面板

在悬浮窗中,.p-swiper 开关配合 data-p-switch 可自动切换面板显隐:

三、动态创建悬浮窗

不通过侧边栏,插件脚本也可在运行时动态创建悬浮窗:

overlay.* 方法一览

权限:ui:sub_window

四、打包发布

悬浮窗 HTML 需随包分发(overlay.file 指向包内路径)。用 CLI 打包时 qomicex pack 会自动把项目根目录的 overlay.html 拷入 dist/:
若 overlay.file 引用 dist/overlay.html 但源码 overlay.html 在项目根目录,qomicex pack 会自动拷入;手动打包时需自行拷贝(见 React + Vite 插件开发 打包章节)。

五、注意事项

  • 悬浮窗 HTML 内容会被启动器处理:抽离 <style>/<link> 到 head、剥壳 <html>/<head>/<body>、注入组件样式
  • 悬浮窗可拖拽(点击非按钮区域),resizable: true 时右下角可缩放(最小 200×120)
  • 关闭悬浮窗请用标题栏的 x 按钮,插件内请通过 __PLUGIN_API__.call('overlay.destroy', id) 销毁
  • 悬浮窗脚本出错不影响主界面;如需调试,关注 DevTools 控制台