/** * @file PaiDialog.h * @brief PAI系统默认对话框 * @date 2011-10-17 */ #ifndef PAI_FRAME_WIDGET_PAIDIALOG_H #define PAI_FRAME_WIDGET_PAIDIALOG_H #include #include #include #include "PaiTitleBar.h" #include "Turtle.h" namespace pai { namespace gui { /** * @class PaiDialog * @brief PAI系统默认对话框 */ class PAI_WIDGET_EXPORT PaiDialog: public QDialog { Q_OBJECT public: /** * @brief 构造函数 * @param[in] pParent 父窗口句柄 * @param[in] flags 窗口类型 */ PaiDialog(QWidget *pParent = NULL, Qt::WindowFlags flags = 0); /** * @brief 析构函数 */ virtual ~PaiDialog(); /** * @brief 获得控件容器,UI或控件可以放到里面 * @return 控件容器 */ QWidget* GetContainer(); /** * @brief 设置TitleBar的显示属性 * @param[in] flags titleBar的flags */ void SetTitleBarFlags(PaiTitleBar::TitleBarFlags flags); /** * @brief 返回TitleBarFlags * @return 对话框标志 */ PaiTitleBar::TitleBarFlags GetTitleBarFlags() const; /** * @brief 设置dialog的title,覆盖基类函数,会将其设置到titlebar * @param[in] windowTitle dialog的title */ void setWindowTitle(const QString & windowTitle); /** * @brief 设置Layout到当前对话框,覆盖基类函数,会设为Container的Layout * @param[in] pLayout layout manager */ void setLayout(QLayout *pLayout); /** * @brief 获得当前对话框的layout,覆盖基类函数,实际返回的时Contgainer的layout * @return 布局 */ QLayout* layout() const; /** * @brief 在TitleBar上Logo和系统菜单中间的区域插入Widget * @param[in] pWidget 要插入的Widgt * @param[in] alignment 在哪一侧,接受Qt::AlignLeft和Qt::AlignRight */ void InsertTitleBarWidget(QWidget *pWidget, Qt::Alignment alignment); /** * @brief 设置是否运输用鼠标改变窗口大小 * @param[in] constraint 是否固定大小 */ void SetConstraintSize(bool constraint); /** * @brief 设置window的Geometry,覆盖基类函数,用来判断window是否是最大化 * @param[in] x x轴坐标 * @param[in] y y轴坐标 * @param[in] with 宽度 * @param[in] height 高度 */ void setGeometry(int x, int y, int with, int height); /** * @brief 设置window的Geometry,覆盖基类函数,用来判断window是否是最大化 * @param[in] rect 矩形区域 */ void setGeometry(const QRect & rect); /** * @brief 设置鼠标改变窗体大小显示方式 * @param[in] mode 0:松开鼠标后窗体变动;1:鼠标左键按下拖动时,窗体大小实时变动; */ static void SetWindowChangeSizeMode(int mode); public slots: /** * @brief 当在有最小化按钮时,需要调整对话框出现的位置 */ void show(); /** * @brief 当在有最小化按钮时,需要调整对话框出现的位置 * @return 对话框出现的位置 */ int exec(); 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 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] mousePosition 当前鼠标所在的坐标 */ void SetCursorShape(const QPoint & mousePosition); /** * @brief Resize事件的实现 * @param[in] mousePosition 当前鼠标所移动的位置 */ void ResizeFrame(const QPoint & mousePosition); private: pai::gui::PaiTitleBar *m_pTitleBar; ///< 标题栏 QWidget *m_pContainer; ///< 容器指针 ResizeDirction m_ResizeDirction; ///< 方向 bool m_IsPress; ///< 按压标志 bool m_moved; ///< 窗口大小是否拖动 QRubberBand *m_pRubberBand; ///< 橡皮筋 int m_TimerID; ///< 定时器id bool m_ConstSize; ///< 因为在设置固定大小后,无法最小化,这里特殊控制一下 static int m_WinChangeSizeMode; ///< 鼠标改变窗体大小方式: 0:鼠标左键弹起后窗体变动;1:鼠标左键按下拖动时,窗体显示实时变动; static bool m_InitWinChangeSizeMode; ///< 因为当前配置保存在配置文件中,暂时添加此变量表示是否初始化加载配置文件 signals: /** * @brief 关闭按钮按下后释放次信号,如果需要在对话框关闭前处理事务,则可直联次信号。 */ void CloseButtonClicked(); }; } } #endif ///< PAI_FRAME_WIDGET_PAIDIALOG_H