// 会话切换过场层 // // 用途:用户点击"连接"后,Moonlight 客户端会先在屏幕左上角创建一个小窗口, // 再扩展到全屏并解码首帧,这段时间画面闪烁、体验割裂。 // 本控件是覆盖在 kiosk 全屏窗口之上的不透明过场层(置顶), // 盖住这个过程,直到收到首帧信号后淡出,让用户感知为"一次平滑的转场"。 #ifndef KIOSK_SHELL_TRANSITION_OVERLAY_H #define KIOSK_SHELL_TRANSITION_OVERLAY_H #include class QLabel; class QTimer; namespace vdi { class TransitionOverlay : public QWidget { Q_OBJECT public: explicit TransitionOverlay(QWidget* parent = nullptr); // 显示过场层并开始动画;title 为提示文字(如"正在进入 Windows 10") void start(const QString& title); // 隐藏过场层(带淡出) void finish(); // 首次视频帧已到达 void onFirstFrame(); protected: bool eventFilter(QObject* watched, QEvent* event) override; private slots: void onTick(); void onFadeStep(); private: QLabel* labelTitle_ = nullptr; QLabel* labelSpinner_ = nullptr; QTimer* tickTimer_ = nullptr; QTimer* fadeTimer_ = nullptr; int dots_ = 0; }; } // namespace vdi #endif // KIOSK_SHELL_TRANSITION_OVERLAY_H