/** * @file PaiWorkspace.h * @brief 该类代表一个复杂布局(支持停靠、区域拆分和页签等方式组织管理界面)的容器控件 * @date 2012-05-07 */ #ifndef PAI_FRAME_WIDGET_PAIWORKSPACE_H #define PAI_FRAME_WIDGET_PAIWORKSPACE_H #include "PaiTabWidget.h" #include "Turtle.h" namespace pai { namespace gui { class PaiDropMask; } } namespace pai { namespace gui { /** * @class PaiWorkspaceExtension * @brief 虚基类,用于定义PaiWorkspace的功能拓展。 */ class PaiWorkspaceExtension { public: /** * @brief 将视图加到指定的页签控件并建立两者之间的关系,这种解决方案效率较低,以后会重构 * @param[in] pView 被拖拽的视图 * @param[in] icon 待添加的视图的图标 * @param[in] text 待添加的视图的名字 * @param[in] pTabWidget 页签控件 * @return 是否添加成功 */ virtual bool AddViewToTabWidget(QWidget *pView, const QIcon & icon, const QString & text, pai::gui::PaiTabWidget *pTabWidget) = 0; /** * @brief 将视图从指定的页签控件移走并切断两者之间的关系,这种解决方案效率较低,以后会重构 * @param[in] pView 被拖拽走的视图 * @param[in] pTabWidget 脱离时的页签控件 * @return 是否移除成功 */ virtual bool RemoveViewFromTabWidget(QWidget *pView, pai::gui::PaiTabWidget *pTabWidget) = 0; }; /** * @class PaiWorkspace * @brief 该类代表一个复杂布局(支持停靠、区域拆分和页签等方式组织管理界面)的容器控件 */ class PAI_WIDGET_EXPORT PaiWorkspace : public QWidget { Q_OBJECT public: /** * @brief 构造函数 * @param[in] pParent 父控件句柄 */ PaiWorkspace(QWidget *pParent); /** * @brief 析构函数 */ virtual ~PaiWorkspace(); /** * @brief 添加一个Widget到指定区域,本函数为临时实现 * @param[in] areaName 区域名 * @param[in] pWidget 待添加的控件 * @param[in] text 待添加的控件的名字 * @param[in] icon 待添加的控件的图标 */ void AddWidget(const QString & areaName, QWidget *pWidget, const QString & text, const QIcon & icon); /** * @brief 将视图加到指定的页签控件并建立两者之间的关系,这种解决方案效率较低,以后会重构 * @param[in] pView 被拖拽的视图 * @param[in] icon 待添加的视图的图标 * @param[in] text 待添加的视图的名字 * @param[in] pTabWidget 页签控件 * @return 是否添加成功 */ static bool AddViewToTabWidget(QWidget *pView, const QIcon & icon, const QString & text, pai::gui::PaiTabWidget *pTabWidget); /** * @brief 将视图从指定的页签控件移走并切断两者之间的关系,这种解决方案效率较低,以后会重构 * @param[in] pView 被拖拽走的视图 * @param[in] pTabWidget 脱离时的页签控件 * @return 是否移除成功 */ static bool RemoveViewFromTabWidget(QWidget *pView, pai::gui::PaiTabWidget *pTabWidget); /** * @brief 获取主Tab组件,通常依据此组件设置窗口标题 * @return 返回主Tab组件 */ PaiTabWidget* GetPrimaryTabWidget() const; /** * @brief 设置拓展对象,为PaiWorkspace增加功能 * @param[in] pExtension 功能拓展对象 */ static void SetExtension(PaiWorkspaceExtension *pExtension); protected: /** * @brief 支持拖动页签到别的区域 * @param[in] pEvent 拖拽事件 */ virtual void dropEvent(QDropEvent *pEvent); /** * @brief 重载此函数来判断拖拽进来的数据是否合法,并给出落点提示 * @param[in] pEvent 拖拽事件 */ virtual void dragEnterEvent(QDragEnterEvent *pEvent); /** * @brief 重载此函数来判断拖拽进来的数据是否合法,并给出落点提示 * @param[in] pEvent 拖拽事件 */ virtual void dragMoveEvent(QDragMoveEvent *pEvent); /** * @brief 重载此函数来取消落点区域位置提示的显示 * @param[in] pEvent 拖拽事件 */ virtual void dragLeaveEvent(QDragLeaveEvent *pEvent); /** * @brief 重载此函数来调用页签控件的关闭流程 * @param[in] pEvent 关闭事件 */ virtual void closeEvent(QCloseEvent *pEvent); /** * @brief 重载eventFilter * @param[in] pObject 事件源 * @param[in] pEvent 事件对象 */ virtual bool eventFilter(QObject *pObject, QEvent *pEvent); private slots: /** * @brief 当所有的页签都被挪走后关闭工作区域 */ void OnAllTabRemoved(); private: PaiDropMask *m_pDropAreaHint; ///< 拖动中的页签的落点的区域位置提示 DragState m_DragState; ///< 拖拽参数 PaiTabWidget *m_pMainTabWidget; ///< 主tab页 static PaiWorkspaceExtension *m_pWorkspaceExtension; ///< PaiWorkspace功能拓展,目前需要拓展与TabWidget之间的注册和反注册功能 signals: /** * @brief 切换父窗口的title * @param[in] title 标题 */ void CurrentTitleChanged(const QString & title); /** * @brief 当数据副标题变化信号,window连接后可用于标题刷新 */ void SubtitleChanged(); }; } } #endif ///< PAI_FRAME_WIDGET_PAIWORKSPACE_H