globalmsgmgr.h 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #ifndef WEAKHINTUTILITY_H
  2. #define WEAKHINTUTILITY_H
  3. #include <QDateTime>
  4. #include <QObject>
  5. #include <QTimer>
  6. #include <QVariantAnimation>
  7. #include <QPropertyAnimation>
  8. #include <QWidget>
  9. class GlobalMsgWidget : public QWidget
  10. {
  11. Q_OBJECT
  12. public:
  13. enum HintMode
  14. {
  15. Success = 0,
  16. Warn = 1,
  17. Normal = 2,
  18. Error = 3,
  19. };
  20. public:
  21. explicit GlobalMsgWidget(const QString &msg, HintMode mode, QWidget *parent = nullptr);
  22. ~GlobalMsgWidget() override{}
  23. private:
  24. HintMode m_mode;
  25. QString m_strMsg;
  26. // int m_nYPos;
  27. QDateTime m_dtStart; //弱提示出现的时间(鼠标移入将不断刷新该时间为当前时间)
  28. QVariantAnimation m_animFlyInOut; //飞入飞出动画
  29. QPropertyAnimation m_animPos; //控制位置的动画
  30. QTimer m_timerCheckIfStay;
  31. private:
  32. QColor GetBGColor(HintMode mode, int alpha = 255);
  33. QColor GetTextColor(HintMode mode, int alpha = 255);
  34. QString GetIconPath(HintMode mode);
  35. protected:
  36. virtual void paintEvent(QPaintEvent *) override;
  37. private slots:
  38. void CheckIfStay();
  39. signals:
  40. void sig_Hide(GlobalMsgWidget *pWeakHint);
  41. };
  42. class GlobalMsgMgr : public QObject
  43. {
  44. Q_OBJECT
  45. public:
  46. static GlobalMsgMgr* Instance(){return sm_pInstance;}
  47. ~GlobalMsgMgr(){sm_pInstance = nullptr;}
  48. void SetRootWidget(QWidget *rootWidget);
  49. QWidget* GetRootWidget(){return m_pRootWidget;}
  50. void Popup(const QString &msg, GlobalMsgWidget::HintMode mode = GlobalMsgWidget::Normal);
  51. //begin:指定弹出窗口为父窗口,父窗口释放前需要Clear
  52. void Popup(const QString &msg, QWidget *parentWidget, GlobalMsgWidget::HintMode mode = GlobalMsgWidget::Normal);
  53. void Clear(QWidget *parentWidget);
  54. //end
  55. private:
  56. GlobalMsgMgr(QObject *parent = nullptr);
  57. //防拷贝, C++11
  58. GlobalMsgMgr(GlobalMsgMgr const&) = delete;
  59. GlobalMsgMgr& operator=(GlobalMsgMgr const&) = delete;
  60. private:
  61. static GlobalMsgMgr* sm_pInstance; //单例实例
  62. static const int skm_nMaxCount = 8;
  63. QWidget *m_pRootWidget;
  64. QList<GlobalMsgWidget*> m_listWeakHints;
  65. QTimer m_timerUpdate;
  66. private slots:
  67. void OnWeakHintHide(GlobalMsgWidget *pWeakHint);
  68. void OnUpdate();
  69. private:
  70. /*----------------------------------------------------------------
  71. * 关于释放全局单例:
  72. * 一个妥善的方法是让这个类自己知道在合适的时候把自己删除; 或者说把删除自己的操作挂在系统中的某个合适的点上, 使其在恰当的时候自动被执行;
  73. * 程序在结束的时候, 系统会自动析构所有的全局变量;事实上, 系统也会析构所有的类的静态成员变量, 就像这些静态成员也是全局变量一样;
  74. * 利用这个特征, 我们可以在单例类中定义一个这样的静态成员变量, 而它的唯一工作就是在析构函数中删除单例类的实例;
  75. ----------------------------------------------------------------*/
  76. class GlobalMsgMgrGarbo
  77. {
  78. public:
  79. ~GlobalMsgMgrGarbo()
  80. {
  81. if(GlobalMsgMgr::sm_pInstance != nullptr)
  82. delete GlobalMsgMgr::sm_pInstance;
  83. }
  84. };
  85. static GlobalMsgMgrGarbo garbo;
  86. /*----------------------------------------------------------------*/
  87. };
  88. #endif // WEAKHINTUTILITY_H