/* * @file PaiTitleBar.h * @brief 自定义的标题栏 * @date 2012-11-29 */ #ifndef PAI_FRAME_WIDGET_PAITITLEBAR_H #define PAI_FRAME_WIDGET_PAITITLEBAR_H #include #include #include "Turtle.h" namespace pai { namespace gui { class PaiToolButton; } } class QMenu; class QHBoxLayout; namespace pai { namespace gui { /** * @class PaiStatusBar * @brief PAI 系统默认风格状态栏 */ class PAI_WIDGET_EXPORT PaiStatusBar: public QStatusBar { public: /** * @brief 构造函数 * @param[in] pParent 父窗口句柄 */ PaiStatusBar(QWidget *pParent = NULL); /** * @brief 析构函数 */ virtual ~PaiStatusBar(); }; /** * @class PaiTitleBar * @brief PAI 系统标准标题栏 */ class PAI_WIDGET_EXPORT PaiTitleBar: public QWidget { Q_OBJECT Q_FLAGS(TitleBarFlags) public: /** * @enum TitleBarFlag * @brief Title Bar 所可选的部分功能 */ enum TitleBarFlag { CloseButtonHint = 0x01, ///< 关闭按钮可视化标志 MaximumButtonHint = 0x02, ///< 最大化按钮可视化标志 MinimumButtonHint = 0x04, ///< 最小化按钮可视化标志 LogoButtonHint = 0x08 ///< logo按钮可视化标志 }; Q_DECLARE_FLAGS(TitleBarFlags, TitleBarFlag) /** * @brief 构造函数 * @param[in] pParent 父窗口句柄 */ PaiTitleBar(QWidget *pParent = NULL); /** * @brief 析构函数 */ virtual ~PaiTitleBar(); /** * @brief 修改titleBar的title * @param[in] title 新的title */ void SetTitle(const QString & title); /** * @brief 设置titleBar的flag,可以设置所有button的隐藏 * @param[in] flags titleBar的flags */ void SetTitleBarFlags(TitleBarFlags flags); /** * @brief 返回TitleBarFlags * @return 标题栏标记 */ PaiTitleBar::TitleBarFlags GetTitleBarFlags() const; /** * @brief 创建system menu * @param[in] pMenu 菜单 */ void CreateSystemMenu(QMenu *pMenu); /** * @brief 在Logo和系统菜单中间的区域插入Widget * @param[in] pWidget 要插入的Widgt * @param[in] alignment 在哪一侧,接受Qt::AlignLeft和Qt::AlignRight */ void InsertWidget(QWidget *pWidget, Qt::Alignment alignment); /** * @brief 修改restore图标状态 * @param[in] maximized 设这成恢复最大的图标 */ void ChangeRestoreButtonState(bool maximized); protected: /** * @brief 重写paint事件 * @param[in] pEvent 事件对象 */ virtual void paintEvent(QPaintEvent *pEvent); /** * @brief 重写鼠标点击事件 * @param[in] pEvent 事件对象 */ virtual void mousePressEvent(QMouseEvent *pEvent); /** * @brief 重写鼠标抬起事件 * @param[in] pEvent 事件对象 */ virtual void mouseReleaseEvent(QMouseEvent *pEvent); /** * @brief 重写鼠标移动事件 * @param[in] pEvent 事件对象 */ virtual void mouseMoveEvent(QMouseEvent *pEvent); /** * @brief 重写鼠标双击事件 * @param[in] pEvent 事件对象 */ virtual void mouseDoubleClickEvent(QMouseEvent *pEvent); /** * @brief 重写resize事件 * @param[in] pEvent 事件对象 */ virtual void resizeEvent(QResizeEvent *pEvent); protected slots: /** * @brief 修改restore图标状态 */ void ChangeRestoreButtonState(); private: /** * @brief 根据titlebar的宽幅和m_iTitleNameCenterStand进行比较,返回titlebar标题文字显示区域 * @param[in] pixelTitle 标题 * @return 返回titlebar标题文字显示区域 */ QRect GetTitleNameRect(int pixelTitle); private: QPoint m_MovePosition; ///< 鼠标点击的坐标,用于拖动titleBar所在的mainFrame QString m_title; ///< 显示的title PaiToolButton *m_pExitButton; ///< 退出按钮 PaiToolButton *m_pMaximumButton; ///< 最大按钮 PaiToolButton *m_pMinimumButton; ///< 最小按钮 PaiToolButton *m_pLogoButton; ///< Logo按钮 QHBoxLayout *m_pRightHLayout; ///< 为了方便向右侧插入窗体 QHBoxLayout *m_pLeftHLayout; ///< 为了方便向左侧插入窗体 TitleBarFlags m_titleBarFlags; //< 标题按钮是否显示的flag signals: /** * @brief Exit按钮被点击的时候发出此信号 */ void HandleExitButton(); /** * @brief Minimum按钮被点击的时候发出此信号 */ void HandleMinimumButton(); /** * @brief Maximum按钮被点击的时候发出此信号 */ void HandleMaximumButton(); }; } } Q_DECLARE_OPERATORS_FOR_FLAGS(pai::gui::PaiTitleBar::TitleBarFlags) ///< 此句必须放在命名控件之外 #endif ///< PAI_FRAME_WIDGET_PAITITLEBAR_H