正常
Step 2:淡入淡出 + 定时自毁
← 手册首页 · 上一步 Step 1 无边框置顶 · 下一步 Step 3 单例堆叠管理 →
目标
把 Step 1 的静态窗口变成:show 时从透明淡入到不透明,停留若干秒,再淡出消失,淡出完对象自动销毁。连点多次不崩。
提示
淡入淡出
windowOpacity是 QWidget 顶层窗口自带属性(0..1),QPropertyAnimation(this, "windowOpacity", this)直接驱动它。别用QGraphicsOpacityEffect——它对顶层窗口的WA_TranslucentBackground圆角透明区无效- 持久成员指针持有
QPropertyAnimation,parent=this让对象树托管;禁DeleteWhenStopped(stop 时被 delete 会悬空,同 StatusLED 教训) fadeIn:opacity_anim_->stop(); setStartValue(windowOpacity()); setEndValue(1.0); start();——从当前值接力,连点不跳变fadeOut:同理但setEndValue(0.0)- 构造期先
setWindowOpacity(0.0),初始透明
定时自毁
QTimer* display_timer_ = new QTimer(this); display_timer_->setSingleShot(true);到点触发fadeOutfadeIn里display_timer_->start(duration_)启动计时fadeOut里先display_timer_->stop()再启动淡出动画- 淡出动画
finished信号回调里close()——配合 Step 1 的WA_DeleteOnClose,close()自动触发deleteLater,对象安全回收
防重入
- 加
bool fading_out_标志:fadeOut入口判if (fading_out_) return;——定时器超时和别处触发可能同时进fadeOut - 进入淡出前,先
disconnect(opacity_anim_, &QPropertyAnimation::finished, nullptr, nullptr)再connect新的 close 回调。否则 fadeIn 挂的 finished 回调和 fadeOut 挂的会同时留在对象上,淡出结束串台
检查点
show 出来从透明渐显(不是突然蹦出来)= 淡入对了;几秒后自动淡出消失 = 定时自毁对了;连点十次按钮不崩 = 防重入对了。
对照答案
- 持久动画指针 + 驱动 windowOpacity:
src/toast-notification.cpp:57 - fadeIn 接力 + 启动计时:
src/toast-notification.cpp:68-77 - fadeOut 防重入 + disconnect/close:
src/toast-notification.cpp:79-92 - WA_DeleteOnClose(close 触发 deleteLater):
src/toast-notification.cpp:39