Skip to content

事件系统

每窗口一个 EventBus,两类事件:WindowEvent(窗口自身)与 PageEvent(WebView2 页面)。

WindowEvent

窗口级事件,带 payload 结构体。

cpp
win->on(WindowEvent::Resize, [](const ResizePayload& p) {
    // p.w, p.h
});
win->on(WindowEvent::Move, [](const MovePayload& p) {
    // p.x, p.y(去抖)
});
win->on(WindowEvent::Close, []([](){} /* 无 payload 或回调 */ {});

常见 WindowEvent:

事件payload触发
ResizeResizePayload{w,h}尺寸变(去抖)
MoveMovePayload{x,y}位置变(去抖)
Close关闭前
Focus / Blur获得/失焦
Minimize / Restore / Maximize状态变
Show / Hide显隐

去抖

Resize / Move 自带去抖——拖动过程不狂触发,停手后派发一次。避免拖拽时业务回调爆炸。

PageEvent

WebView2 页面级事件。

cpp
win->on(PageEvent::DidFinishLoad, []() {
    // 页面加载完成,可安全 executeJavaScript / call
});
win->on(PageEvent::TitleChanged, [](const TitlePayload& p) {
    // p.title
});

常见 PageEvent:

事件说明
DidFinishLoad页面加载完成(注入 runtime、调 JS 的安全时机)
TitleChanged页面标题变
NavigationStarting / NavigationCompleted导航起止

onBeforeClose

关闭是特殊事件——可取消

cpp
win->onBeforeClose([]() -> bool {
    if (hasUnsavedWork()) {
        promptSave();
        return false;   // 阻止本次关闭
    }
    return true;        // 放行
});

返回 false 阻止窗口关闭,用于未保存提示、最小化到托盘等。

App 级事件

进程级生命周期 + 自动更新:

cpp
app.on(AppEvent::Quit, []() { /* 退出前清理 */ });
app.onBeforeQuit([]() -> bool {
    return allowQuit();   // false 取消退出
});

// 自动更新事件
app.on(AppEvent::UpdateAvailable, [](const UpdateInfo& info) {
    // info.version / info.url / info.releaseNotes
});
app.on(AppEvent::UpdateDownloadProgress, [](const UpdateProgress& p) {
    // p.percent / p.bytesPerSecond
});
app.on(AppEvent::UpdateDownloaded, [](const UpdateInfo& info) {
    // info.filePath = 本地 exe 路径,可调 quitAndInstall()
});
app.on(AppEvent::UpdateError, [](const std::wstring& err) {
    // 显示错误
});
事件payload说明
Readyapp 就绪
Quit退出前
ThemeChanged系统主题变
UpdateChecking开始检查更新
UpdateAvailableUpdateInfo新版本可用
UpdateNotAvailable已是最新
UpdateDownloadProgressUpdateProgress下载进度
UpdateDownloadedUpdateInfo下载完成
UpdateErrorwstring出错

线程安全

WARNING

EventBus 仅 UI 线程安全。所有事件回调在 UI 线程派发。跨线程想触发事件,用 App 投递回 UI 线程,勿直接调 EventBus。

下一步