timewidget.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #ifndef TIMEWIDGET_H
  2. #define TIMEWIDGET_H
  3. /**
  4. * 使用说明
  5. * 1、这个时间选择器支持两种方式
  6. * * 提升QTimeEdit,作为编辑栏修改时间
  7. * * 以弹窗的方式出现
  8. * 2、时间选择区域m_wdgTimeArea和时间编辑栏(在UI中)不是统一的,时间选择区域可以点击时间编辑栏
  9. * 创建出来,也可以在弹窗中直接显示出来,所以moveEvent事件就是用来移动m_wdgTimeArea的。
  10. * 3、在原来的基础上新添加了两个信号,在关闭的时候发送
  11. * 4、使用Dialog模式的时候,点击空白处隐藏就会close掉,然后发送新的时间信号
  12. * 5、使用Dialog模式,执行execShow()函数,会阻塞运行,直到关闭
  13. * 6、如果需要对比修改之前和之后的时间,需要使用Popup的方式修改时间,禁止在编辑栏直接修改
  14. * 7、设置启用与关闭调用 setEditLineEnable(bool enable) 函数,不要使用默认的 setEnabled函数
  15. */
  16. #include <QFrame>
  17. #include <QTime>
  18. class TimePartWidget;
  19. class QListWidgetItem;
  20. class ShadowWidget;
  21. class TimePopupWidget;
  22. namespace Ui {
  23. class TimeWidget;
  24. }
  25. /* 添加ShowType类型,判断这个控件是编辑栏还是弹窗 */
  26. class TimeWidget : public QFrame
  27. {
  28. Q_OBJECT
  29. public:
  30. enum ShowType{
  31. EditLine = 0, /* 时间编辑栏 */
  32. Dialog = 1, /* 以弹窗的形式出现 */
  33. };
  34. explicit TimeWidget(QWidget *parent = nullptr, ShowType type = EditLine);
  35. // explicit TimeWidget(ShowType type = EditLine);
  36. ~TimeWidget();
  37. // 在父窗口无法容纳控件时,这是必要的
  38. void SetMainWindow(QWidget* pWidget);
  39. QTime getTime();
  40. void setTime(const QTime& t);
  41. void clearTime();
  42. QString tipText() const;
  43. /* 新增一个设置时间条宽度的函数 */
  44. // void setTimeAreaWidth(int w);
  45. /***** 2024-05-25 添加两个信号 ******/
  46. void showTimeEditArea();
  47. /* 以弹窗的模式模态显示 */
  48. void execShow();
  49. /* 设置时间图标 */
  50. void setIcon(const QString& icon);
  51. /* 设置图标显示 */
  52. void setIconShow(bool isShow);
  53. /* 设置图标大小 */
  54. void setIconSize(int w, int h);
  55. /* 设置编辑栏大小 */
  56. void setEditLine(int w, int h);
  57. /* 设置禁止使用滚轮修改时间 */
  58. void setWheelDisabled(bool disabled);
  59. /* 设置启用与否 */
  60. void setEditLineEnable(bool enable);
  61. /* 设置QSS */
  62. void setQSS();
  63. signals:
  64. void signal_timeChanged(const QTime& formerTime, const QTime& nowTime);
  65. void signal_close();
  66. protected:
  67. bool eventFilter(QObject* obj, QEvent* e) override;
  68. void moveEvent(QMoveEvent *event) override;
  69. private slots:
  70. /* 点击了时间图标 */
  71. void do_pBtn_tip_Clicked();
  72. /* 这个用来实时修改编辑栏的时间 */
  73. void do_dateTimeChanged(const QTime& dt);
  74. void onDateTimeChanged(const QDateTime& dt);
  75. /* 关闭Popup弹窗 */
  76. void do_closePopup(bool isOk);
  77. private:
  78. void UpdateProperty(QObject* obj, const char* name, bool flag);
  79. void UpdatePopupTime(const QDateTime& dt);
  80. void ShowPopupArea(bool bShow);
  81. void CreatePopupWidget();
  82. /* 初始化函数 */
  83. void Init();
  84. private:
  85. // const int TIME_AREA_WIDTH = 56;
  86. const int TIME_AREA_WIDTH = 46;
  87. const int TIME_AREA_HEIGHT = 32;
  88. const int SHADOW_MARGIN = 9; // 对应BlurRadius模糊半径16px
  89. Ui::TimeWidget *ui;
  90. TimePopupWidget* m_pTimePopupWidget = nullptr;
  91. QVector<int> m_vecTimeSections;
  92. bool m_bTimeFlag{false}; // 时间更新标志
  93. QScopedPointer<ShadowWidget> m_wdgTimeArea; // 时间选择窗口
  94. QWidget* m_pMainWindow; // 外层祖辈窗口,能容纳时间控件高度即可(默认父窗口)
  95. ShowType m_type; /* 显示类型 */
  96. // int m_width = 0; /* TimeArea宽度 */
  97. bool m_isDisableWheel = false; // 禁用滚轮修改时间
  98. // bool m_isBanPopupShow = false; /* 禁止Popup显示,这个标志位用于关闭Popup弹窗时设置的,防止QEditLine获取焦点后再显示 */
  99. QDateTime m_formerDateTime; /* 修改前的时间 */
  100. };
  101. #endif // TIMEWIDGET_H