logplus/Workflow/WFWidget/include/PaiWindow.h
2026-01-17 12:55:45 +08:00

232 lines
6.6 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @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