232 lines
6.6 KiB
C++
232 lines
6.6 KiB
C++
/**
|
||
* @file PaiWindow.h
|
||
* @brief PAI系统风格默认窗体
|
||
* @date 2012-12-13
|
||
*/
|
||
#ifndef PAI_FRAME_WIDGET_PAIWINDOW_H
|
||
#define PAI_FRAME_WIDGET_PAIWINDOW_H
|
||
|
||
#include <QFrame>
|
||
#include <QRubberBand>
|
||
#include <QLayout>
|
||
#include <QMenu>
|
||
|
||
#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
|