跳转至

Python API

from prismqml import ... 可直接导入的顶层 API。

应用与窗口

名称 说明
App 应用入口,自动完成 DPI / register_types / 孵化控制器 / Translator 环境初始化
Window / WindowCore 主窗口
WindowType 窗口类型枚举(BAR / SPLIT / FILLED)
NavigationItem 导航项
AsyncQmlPage 使用引擎标准 LoadingOverlay 和孵化控制器异步创建带 Python backend 的 QML 页面
prepare_windows_icon 从单一图片生成 Windows 多尺寸 ICO
nuitka_icon_options 从同一源图片生成当前平台的 Nuitka 图标参数
from pathlib import Path

from prismqml import App, WindowType

app = App(application_icon=Path(__file__).with_name("app_icon.png"))
window = app.create_window(WindowType.BAR)

splash_subtitle 是应用级启动页副标题入口;创建 App 时传入后,FastSplash、 纯 QML 默认窗口、Python 窗口以及内嵌 Splash 回退会共同使用该值。不传入时使用 引擎默认启动文案和旧版启动时序;窗口级 splashSubtitleshowSplash() 参数 可以显式覆盖。

App(allow_qml_file_read=True) 默认在创建 QML 引擎前启用 Translator 的本地 i18n JSON 读取;传入 False 可显式关闭。普通 import prismqml 不会修改该环境变量。

Windows 下 App 还会在首个 QQuickWindow 创建前固定选择 D3D11。自行装配 Qt 应用时,必须在创建 QApplication 前调用 prismqml.python.runtime.prepare_application_environment(True),并在创建 QQmlApplicationEngine 后调用 register_types(engine);跨层 context/provider 注册统一由该公开入口完成。

application_icon 是应用级统一入口:Qt 全局图标、当前及后续创建的 PrismQML 窗口、任务栏和默认启动画面都会继承它;运行时也可调用 app.set_application_icon(path, colored=True) 更新全部托管窗口。构建阶段可把同一 源图片交给 nuitka_icon_options(source, output_dir);Windows 会生成多尺寸 ICO, macOS/Linux 则返回 Nuitka 已验证的平台参数。Inno Setup 等外部安装器可直接消费 prepare_windows_icon() 返回的 ICO 路径。

使用自定义 QML 宿主时,可将已创建的主窗口交给 app.attach_startup_window(window),接入 App 持有的 FastSplash 生命周期。 标准 Fluent.Windows 会自动完成这一步。

AsyncQmlPage 供 Python 页面工厂使用。目标 QML 根对象必须声明 property var backend;页面管理器会先挂载轻量宿主,再通过异步 Loader 分帧创建目标对象树,并在 page_ready 之前持续显示窗口自带的标准加载遮罩:

from pathlib import Path

from prismqml import AsyncQmlPage

class LibraryPage(AsyncQmlPage):
    def __init__(self, parent=None):
        super().__init__(Path(__file__).with_name("LibraryPage.qml"), parent)

字符串和 Path 表示本地文件;其他 URL 应显式传入 QUrl。页面工厂本身及其 Python 业务初始化仍同步执行,应保持轻量;该封装异步处理的是目标 QML 对象树。 如果目标根对象内部还有需要分帧完成的首屏容器(例如 StackView.initialItem), 可声明 property bool prismqmlAsyncReady。引擎会等待该属性首次变为 true 后再 发出 page_ready;未声明该属性的页面仍以 Loader Ready 作为就绪条件。

皮肤与主题

名称 说明
Skin 皮肤枚举(FLUENT / NEOBRUTALISM / VINTAGE_TICKET / NEUMORPHISM)
setSkin / getSkin 切换 / 获取皮肤
Theme 主题枚举(LIGHT / DARK / AUTO)
setTheme / getTheme / isDark 主题切换 / 查询
setAccentColor / getAccentColor / accentQColor 主题色
getThemeManager ThemeManager 单例

状态与配置

名称 说明
Store 响应式状态存储
prismqml.python.config 配置系统(AppConfig / getConfigManager / SettingsCore / SettingEntry / Validator)

后台任务

业务代码无需继承 QRunnableQThread 或手写 worker 对象,只需提交普通 Python callable:

from prismqml import current_task, run_in_pool

def load_library(path):
    task = current_task()
    task.report_progress("scanning")
    task.raise_if_cancelled()
    return scan_library(path)

handle = run_in_pool(load_library, library_path)
handle.progress.connect(update_progress)
handle.succeeded.connect(apply_library)
handle.failed.connect(report_failure)

run_in_pool() 默认使用 PrismQML 进程级受管线程池,适合有界、可并发的后台调用; run_in_thread() 为单次调用创建独立 QThread,适合需要独占线程的长阻塞任务, 但不替代需要持续事件循环的 QObject/QThread 服务。 两者都返回 TaskHandle,统一提供 startedprogresssucceededfailedcancelledfinishedstate_changed 信号。公开信号在 Qt 应用 线程发出,result / failure / state 可读取最终状态;TaskFailure 同时保留 异常对象和格式化堆栈。

自定义线程池、优先级和背压通过独立选项对象传入,不会占用普通 callable 的位置参数:

from prismqml import PoolSubmitPolicy, PoolTaskOptions, TaskThreadPool, run_in_pool

io_pool = TaskThreadPool()
io_pool.setMaxThreadCount(16)
options = PoolTaskOptions(pool=io_pool, priority=10)
handle = run_in_pool(load_library, library_path, task_options=options)

# 繁忙时不排队,直接抛出 TaskRejectedError
immediate = PoolTaskOptions(
    pool=io_pool,
    submit_policy=PoolSubmitPolicy.REQUIRE_AVAILABLE,
)

PoolTaskOptions.pool 只接受 TaskThreadPool。它会在 clear() 时结算已排队的 PrismQML 任务;原生 QThreadPool 无法通知框架哪些非自动删除任务被外部清掉, 因此不会被接受。

handle.cancel() 是协作式取消,不会调用不安全的 terminate()。尚未开始的线程池 任务会尽量从队列安全移除;已经运行的任务应周期性调用 current_task().raise_if_cancelled(),或读取 cancel_requested 完成清理后返回。 一旦 cancel() 接受请求,随后正常返回也会结算为 CANCELLED,不会误报成功。

handle.wait(timeout_ms) 仅适合测试或非 UI 退出流程;返回 True 时后端已经停止, 且 state / result / failure 可立即读取。公开信号仍在 Qt 应用线程排队派发, 因此 wait() 返回时回调可能尚未执行;正常界面逻辑应监听信号,避免阻塞事件循环。

shutdown_tasks(timeout_ms) 先向当前全部任务请求取消,再使用一个共享总截止时间等待, 并返回 TaskShutdownReportcompleteFalse 时,pending 保留仍运行的句柄, 调用方可完成业务清理后再次调用。App(task_shutdown_timeout_ms=...) 会将同一策略用于 App.exec() 退出;超时时抛出 TaskShutdownTimeoutError 并保留 Qt 运行时,防止活跃 QThread 被析构;调用方完成清理后可调用公开且幂等的 app.shutdown() 重试。 默认 None 表示为了安全持续等待。若只使用裸 QCoreApplication,应在销毁应用前显式调用 shutdown_tasks()。Python CPU 密集型 代码仍受 GIL 限制,需要真正并行时应使用多进程。

shutdown_tasks() 必须从 Qt 应用线程调用;后台任务调用会立即抛出 RuntimeError, 避免任务等待自身结束。

引擎组件

名称 说明
Updater 基于 GitHub Releases 的自动更新,支持自定义 API 根地址
SingleInstance 单实例(Named Mutex + IPC)
SystemTrayIcon 系统托盘
Icon / make_icon / make_theme_icon 图标
IconProvider / register_icon_provider 显式图标路径提供器,仅公开 getPath(name) / isValid(name);窗口默认不注入 Icon context
ShadowManager / getShadowManager / installDwmSyncFilter 窗口阴影

Updater(..., api_base_url="https://github.example/api/v3") 的显式地址优先,其次读取 PRISMQML_UPDATER_API_BASE_URL,最后使用 GitHub 公共 API;空白和尾部 / 会被归一化。

版本比较会去除可选的 v / V 前缀,支持项目使用的可变长度点分数字主版本和点分预发布标识;正式版高于同主版本的预发布版,+ 后的构建元数据不参与优先级,空白或仅前缀标签视为最小版本。该逻辑用于比较 GitHub tag,不是严格拒绝非标准 tag 的完整 SemVer 校验器。

release 响应必须是严格 UTF-8 JSON 对象,tag_name 必须是非空字符串,bodyhtml_urlassets 及 asset 字段会按公开 schema 校验;默认还要求所选安装资产带有效的 sha256:<64位十六进制> digest,下载完成后会再次校验摘要。非法输入只发 checkFailed,不会被静默截断或误报为可更新。下载使用进程唯一临时文件,完整写入并 flush/fsync/close 后原子发布;网络、写入、关闭、提交、摘要或空文件失败只发一次 downloadFailed 并清理残留。同一 Updater 实例已有任意检查或下载事务时,新检查/下载调用会发对应失败信号而不是静默丢弃。requireArtifactDigest 是 QML 只读属性;若可信 Python 集成确实需要兼容旧服务,可显式调用 set_require_artifact_digest()

日志

名称 说明
Logger / getLogger 日志器
debug / info / warning / error / exception 日志函数

工具

名称 说明
qml_path QML 模块路径
configure_qml_environment 在裸 QQmlApplicationEngine 创建前显式配置 Translator 所需的本地 QML XHR
register_types 注册 QML 类型(App 内部已调用)
from PySide6.QtQml import QQmlApplicationEngine
from prismqml import configure_qml_environment

configure_qml_environment()
engine = QQmlApplicationEngine()

完整导出见 prismqml/__init__.py__all__