206 lines
6.1 KiB
C++
206 lines
6.1 KiB
C++
/**
|
||
* @file PaiDialog.h
|
||
* @brief PAI系统默认对话框
|
||
* @date 2011-10-17
|
||
*/
|
||
#ifndef PAI_FRAME_WIDGET_PAIDIALOG_H
|
||
#define PAI_FRAME_WIDGET_PAIDIALOG_H
|
||
|
||
#include <QDialog>
|
||
#include <QLayout>
|
||
#include <QRubberBand>
|
||
|
||
#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
|