#ifndef TIMEWIDGET_H #define TIMEWIDGET_H /** * 使用说明 * 1、这个时间选择器支持两种方式 * * 提升QTimeEdit,作为编辑栏修改时间 * * 以弹窗的方式出现 * 2、时间选择区域m_wdgTimeArea和时间编辑栏(在UI中)不是统一的,时间选择区域可以点击时间编辑栏 * 创建出来,也可以在弹窗中直接显示出来,所以moveEvent事件就是用来移动m_wdgTimeArea的。 * 3、在原来的基础上新添加了两个信号,在关闭的时候发送 * 4、使用Dialog模式的时候,点击空白处隐藏就会close掉,然后发送新的时间信号 * 5、使用Dialog模式,执行execShow()函数,会阻塞运行,直到关闭 * 6、如果需要对比修改之前和之后的时间,需要使用Popup的方式修改时间,禁止在编辑栏直接修改 */ #include #include class TimePartWidget; class QListWidgetItem; class ShadowWidget; class TimePopupWidget; namespace Ui { class TimeWidget; } /* 添加ShowType类型,判断这个控件是编辑栏还是弹窗 */ class TimeWidget : public QFrame { Q_OBJECT public: enum ShowType{ EditLine = 0, /* 时间编辑栏 */ Dialog = 1, /* 以弹窗的形式出现 */ }; explicit TimeWidget(QWidget *parent = nullptr, ShowType type = EditLine); // explicit TimeWidget(ShowType type = EditLine); ~TimeWidget(); // 在父窗口无法容纳控件时,这是必要的 void SetMainWindow(QWidget* pWidget); QTime getTime(); void setTime(const QTime& t); void clearTime(); QString tipText() const; /* 新增一个设置时间条宽度的函数 */ // void setTimeAreaWidth(int w); /***** 2024-05-25 添加两个信号 ******/ void showTimeEditArea(); /* 以弹窗的模式模态显示 */ void execShow(); /* 设置时间图标 */ void setIcon(const QString& icon); /* 设置图标显示 */ void setIconShow(bool isShow); /* 设置图标大小 */ void setIconSize(int w, int h); /* 设置编辑栏大小 */ void setEditLine(int w, int h); /* 设置禁止使用滚轮修改时间 */ void setWheelDisabled(bool disabled); /* 设置启用与否*/ void setEditLineEnable(bool enable); /* 设置QSS */ void setQSS(); signals: void signal_timeChanged(const QTime& formerTime, const QTime& nowTime); void signal_close(); protected: bool eventFilter(QObject* obj, QEvent* e) override; void moveEvent(QMoveEvent *event) override; private slots: /* 点击了时间图标 */ void do_pBtn_tip_Clicked(); /* 这个用来实时修改编辑栏的时间 */ void do_dateTimeChanged(const QTime& dt); void onDateTimeChanged(const QDateTime& dt); /* 关闭Popup弹窗 */ void do_closePopup(bool isOk); private: void UpdateProperty(QObject* obj, const char* name, bool flag); void UpdatePopupTime(const QDateTime& dt); void ShowPopupArea(bool bShow); void CreatePopupWidget(); /* 初始化函数 */ void Init(); private: // const int TIME_AREA_WIDTH = 56; const int TIME_AREA_WIDTH = 46; const int TIME_AREA_HEIGHT = 32; const int SHADOW_MARGIN = 9; // 对应BlurRadius模糊半径16px Ui::TimeWidget *ui; TimePopupWidget* m_pTimePopupWidget = nullptr; QVector m_vecTimeSections; bool m_bTimeFlag{false}; // 时间更新标志 QScopedPointer m_wdgTimeArea; // 时间选择窗口 QWidget* m_pMainWindow; // 外层祖辈窗口,能容纳时间控件高度即可(默认父窗口) ShowType m_type; /* 显示类型 */ // int m_width = 0; /* TimeArea宽度 */ bool m_isDisableWheel = false; // 禁用滚轮修改时间 bool m_isBanPopupShow = false; /* 禁止Popup显示,这个标志位用于关闭Popup弹窗时设置的,防止QEditLine获取焦点后再显示 */ QDateTime m_formerDateTime; /* 修改前的时间 */ }; #endif // TIMEWIDGET_H