/** * @file PaiWindow.h * @brief PAI系统风格默认窗体 * @date 2012-12-13 */ #ifndef PAI_FRAME_WIDGET_PAIWINDOW_H #define PAI_FRAME_WIDGET_PAIWINDOW_H #include #include #include #include #include "PaiTitleBar.h" #include "Turtle.h" namespace pai { namespace gui { /** * @class PaiWindow * @brief PAI 系统风格默认窗体 */ class PAI_WIDGET_EXPORT PaiWindow: public QFrame { Q_OBJECT public: /** * @brief 构造函数 * @param[in] parent 父窗口句柄 */ PaiWindow(QWidget *parent = NULL); /** * @brief 析构函数 */ virtual ~PaiWindow(); /** * @brief 获得控件容器,UI或控件可以放到里面 * @return 控件容器 */ QWidget* GetContainer(); /** * @brief 设置TitleBar的显示属性 * @param[in] flags titleBar的flags */ void SetTitleBarFlags(PaiTitleBar::TitleBarFlags flags); /** * @brief 设置状态栏是否显示 * @param[in] visible 显示与否 */ void SetStatusBarVisible(bool visible); /** * @brief 设置标题栏是否显示 * @param[in] visible 显示与否 */ void SetTitleBarVisible(bool visible); /** * @brief 设置Layout到当前对话框 * @note 覆盖基类函数,会设为Container的Layout * @param[in] pLayout layout manager */ void setLayout(QLayout *pLayout); /** * @brief 获得当前对话框的layout * @note 覆盖基类函数,实际返回的时Container的layout * @return 对话框的layout */ QLayout* layout() const; /** * @brief 返回statusBar的指针 * @return 返回statusBar的指针 */ QStatusBar* statusBar(); /** * @brief 返回systemMenu的指针 * @return 返回systemMenu的指针 */ QMenu* systemMenu(); /** * @brief 返回settingMenu的指针 * @return 返回settingMenu的指针 */ QMenu* settingMenu(); /** * @brief 更新title bar的menu */ void updateMenu(); /** * @brief 在TitleBar上Logo和系统菜单中间的区域插入Widget * @param[in] pWidget 要插入的Widgt * @param[in] alignment 在哪一侧,接受Qt::AlignLeft和Qt::AlignRight */ void InsertTitleBarWidget(QWidget *pWidget, Qt::Alignment alignment); /** * @brief 设置window的Geometry * @note 覆盖基类函数,用来判断window是否是最大化 * @param[in] x 左部坐标 * @param[in] y 顶部坐标 * @param[in] w 宽度 * @param[in] h 高度 */ void setGeometry(int x, int y, int w, int h); /** * @brief 设置window的Geometry * @note 覆盖基类函数,用来判断window是否是最大化 * @param[in] rect 矩形坐标 */ void setGeometry(const QRect &rect); /** * @brief 设置window的WindowStates * @note 覆盖基类函数,用来设置标题栏最大化按钮 * @param[in] state Qt::WindowStates */ void setWindowState(Qt::WindowStates state); /** * @brief 设置鼠标改变窗体大小显示方式 * @param[in] mode 0:松开鼠标后窗体变动;1:鼠标左键按下拖动时,窗体大小实时变动 */ static void SetWindowChangeSizeMode(int mode); public slots: /** * @brief 设置window的title * @note 覆盖基类函数,会将其设置到titlebar * @param[in] windowTitle dialog的title */ void setWindowTitle(const QString & windowTitle); protected: /** * @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 一旦鼠标样式更改,每隔100毫秒判断一次鼠标位置,以便更改鼠标样式 * @param[in] pEvent 事件对象 */ virtual void timerEvent(QTimerEvent *pEvent); /** * @brief 重载此函数来调用页签控件的关闭流程 * @param[in] pEvent 事件对象 */ virtual void closeEvent(QCloseEvent *pEvent); /** * @brief 用来绘制边框 * @param[in] pEvent 事件对象 */ virtual void paintEvent(QPaintEvent *pEvent); private: /** * @enum ResizeDirction * @brief Resize事件中拖动的方向 */ enum ResizeDirction { ResizeDirction_None = 0, ///< 未知方向的拖动 ResizeDirction_Top = 1, ///< 向上拖动 ResizeDirction_Bottom = 2, ///< 向下拖动 ResizeDirction_Left = 3, ///< 向左拖动 ResizeDirction_Right = 4, ///< 向右拖动 ResizeDirction_TopLeft = 5, ///< 向左上拖动 ResizeDirction_TopRight = 6, ///< 向右上拖动 ResizeDirction_BottomLeft = 7, ///< 向左下拖动 ResizeDirction_BottomRight = 8 ///< 向右下拖动 }; /** * @brief 触发Resize事件之前用来更新鼠标样式 * @param[in] mousePosion 当前鼠标所在的坐标 */ void setCursorShape(const QPoint & mousePosion); /** * @brief Resize事件的实现 * @param[in] mousePosion 当前鼠标所移动的位置 */ void resizeFrame(const QPoint & mousePosion); private: ResizeDirction m_ResizeDirction; ///< 拖动的方向变量 bool m_IsPress; ///< 鼠标是否按下 bool m_IsMoved; ///< 鼠标是否拖动 QRubberBand *m_pRubberBand; ///< 窗口大小改变时显示的边框 pai::gui::PaiTitleBar *m_pTitleBar; ///< 自定义的titleBar pai::gui::PaiStatusBar *m_pStatusBar; ///< 自定义的statusBar QMenu *m_pSystemMenu; ///< 自定义的systemMenu QMenu *m_pSettingMenu; ///< 自定义的settingMenu QWidget *m_pContainerWidget; ///< 容器指针 int m_TimerID; ///< 定时器ID static int m_WinChangeSizeMode; ///< 鼠标改变窗体大小方式: 0:鼠标左键弹起后窗体变动;1:鼠标左键按下拖动时,窗体显示实时变动; static bool m_IsInitWinChangeSizeMode; ///< 因为当前配置保存在配置文件中,暂时添加此变量表示是否初始化加载配置文件 }; } } #endif ///< PAI_FRAME_WIDGET_PAIWINDOW_H