#ifndef WEAKHINTUTILITY_H #define WEAKHINTUTILITY_H #include #include #include #include #include #include class GlobalMsgWidget : public QWidget { Q_OBJECT public: enum HintMode { Success = 0, Warn = 1, Normal = 2, Error = 3, }; public: explicit GlobalMsgWidget(const QString &msg, HintMode mode, QWidget *parent = nullptr); ~GlobalMsgWidget() override{} private: HintMode m_mode; QString m_strMsg; // int m_nYPos; QDateTime m_dtStart; //弱提示出现的时间(鼠标移入将不断刷新该时间为当前时间) QVariantAnimation m_animFlyInOut; //飞入飞出动画 QPropertyAnimation m_animPos; //控制位置的动画 QTimer m_timerCheckIfStay; private: QColor GetBGColor(HintMode mode, int alpha = 255); QColor GetTextColor(HintMode mode, int alpha = 255); QString GetIconPath(HintMode mode); protected: virtual void paintEvent(QPaintEvent *) override; private slots: void CheckIfStay(); signals: void sig_Hide(GlobalMsgWidget *pWeakHint); }; class GlobalMsgMgr : public QObject { Q_OBJECT public: static GlobalMsgMgr* Instance(){return sm_pInstance;} ~GlobalMsgMgr(){sm_pInstance = nullptr;} void SetRootWidget(QWidget *rootWidget); QWidget* GetRootWidget(){return m_pRootWidget;} void Popup(const QString &msg, GlobalMsgWidget::HintMode mode = GlobalMsgWidget::Normal); //begin:指定弹出窗口为父窗口,父窗口释放前需要Clear void Popup(const QString &msg, QWidget *parentWidget, GlobalMsgWidget::HintMode mode = GlobalMsgWidget::Normal); void Clear(QWidget *parentWidget); //end private: GlobalMsgMgr(QObject *parent = nullptr); //防拷贝, C++11 GlobalMsgMgr(GlobalMsgMgr const&) = delete; GlobalMsgMgr& operator=(GlobalMsgMgr const&) = delete; private: static GlobalMsgMgr* sm_pInstance; //单例实例 static const int skm_nMaxCount = 8; QWidget *m_pRootWidget; QList m_listWeakHints; QTimer m_timerUpdate; private slots: void OnWeakHintHide(GlobalMsgWidget *pWeakHint); void OnUpdate(); private: /*---------------------------------------------------------------- * 关于释放全局单例: * 一个妥善的方法是让这个类自己知道在合适的时候把自己删除; 或者说把删除自己的操作挂在系统中的某个合适的点上, 使其在恰当的时候自动被执行; * 程序在结束的时候, 系统会自动析构所有的全局变量;事实上, 系统也会析构所有的类的静态成员变量, 就像这些静态成员也是全局变量一样; * 利用这个特征, 我们可以在单例类中定义一个这样的静态成员变量, 而它的唯一工作就是在析构函数中删除单例类的实例; ----------------------------------------------------------------*/ class GlobalMsgMgrGarbo { public: ~GlobalMsgMgrGarbo() { if(GlobalMsgMgr::sm_pInstance != nullptr) delete GlobalMsgMgr::sm_pInstance; } }; static GlobalMsgMgrGarbo garbo; /*----------------------------------------------------------------*/ }; #endif // WEAKHINTUTILITY_H