#pragma once #include "iDlgBaseEx.h" #include "iRibbonXmlTab.h" #include "iGuiRibbon_global.h" ///ZXF202605 /// @brief Ribbon简化,仅仅GroupBar模式(这个就相当于ToolBar 里面的 有多个GroupBar,就相当于一个Group一个面板,用于控制折叠这个面板的上按钮) class I_GUI_RIBBON_EXPORT iWxGroupBar : public QWidget { Q_OBJECT public: explicit iWxGroupBar(iRibbonXmlGroup* pGroupXml = NULL, \ QWidget *parent = 0); ~iWxGroupBar(); //设置关联的配置信息 void setGroupInfo(); // 折叠控制(供 iWxToolBar 自动布局调用) void setCollapsed(bool b); bool getCollapsed() const ; int expandedWidth(); int collapsedWidth(); // 返回 ButtonWithMenu 类型 cmd 创建的子菜单 action QVector& getMenuActions() ; // 返回该 Group 内创建的所有子控件 QVector& getSubCtrls() ; //得到里面控件个数是否需要折叠按钮 bool bCollapse(); public: //初始化 virtual void initUI(); virtual void initSheets(); protected: //初始化控件 void initCtrlUI(); //初始化面板按钮 void initGroupBt(); //初始化控件上部分(主要功能区) void initCtrlTopUI(); //两种布局 void initCtrlTopGridUI();//网格 void initCtrlTopHorUI(); //水平 //初始化控件下部分(标签区+折叠按钮) void initCtrlBotUI(); // 各种类型 QWidget* createTabBy(iRibbonXmlTab* pTab); QWidget* createGroupBy(iRibbonXmlGroup* pGroup); QWidget* createCmdBy(iRibbonXmlCmd* pCmd, bool bAdd = true); QWidget* createCmdBy_Btn(iRibbonXmlCmd* pCmd); QWidget* createCmdBy_Combo(iRibbonXmlCmd* pCmd); QWidget* createCmdBy_Check(iRibbonXmlCmd* pCmd); QWidget* createCmdBy_Radio(iRibbonXmlCmd* pCmd); QWidget* createCmdBy_Text(iRibbonXmlCmd* pCmd); QWidget* createCmdBy_Label(iRibbonXmlCmd* pCmd); QWidget* createCmdBy_ListWx(iRibbonXmlCmd* pCmd); //新增加边界框 QWidget* createCmdBy_LineEdit(iRibbonXmlCmd* pCmd); // 对于按钮,比较特殊,分别进行实现 QWidget* _createCmdBy_Btn_Normal(iRibbonXmlCmd* pCmd); //常规按钮 QWidget* _createCmdBy_Btn_Menu(iRibbonXmlCmd* pCmd); //下拉菜单式按钮 QWidget* _createCmdBy_Btn_Split(iRibbonXmlCmd* pCmd); //劈分式按钮 virtual bool dealwithCmdSubBy(iRibbonXmlCmd* pCmd, QToolButton*& pBtn); protected: virtual void paintEvent(QPaintEvent* event) ; virtual void mousePressEvent(QMouseEvent* event) ; virtual void mouseMoveEvent(QMouseEvent* event) ; virtual void leaveEvent(QEvent* event) ; //焦点判断 bool eventFilter(QObject *, QEvent *); // 让 Qt 认为 group 可以一直缩到折叠态宽度, // 否则按钮们的 minimumSizeHint 会经 layout 累加上传, // 把主窗口的最小宽度顶死,导致拖动边框拉不动。 virtual QSize minimumSizeHint() const; private slots: //面板折叠 void slotGroupCollapse(); void slotBtnClicked(); //Btn void slotListCtrlIndexChanged(int); //Combox ListWx void slotCheckCtrlClicked(bool); //CheckBox, RadioBox void slotSplitBtnClicked(QString sName); //Split Btn //面板按钮响应(弹出当前Group的Ctrl,重组一个对话框,无边框只有ctrl) void slotGroupBtnClicked(); signals: /// @title Ribbon信号触发 /// @param pCtrl触发的子控件 /// @param pInfo关联的Ribbon配置信息(来自xml) void sigRibbonActioned(QWidget* pCtrl, iRibbonXmlCmd* pInfo, QVariant o); /// @title Ribbon文件菜单信号触发 /// @param sID菜单ID /// @param sName菜单名称 void sigRibbonFileMenuClicked(QString sID, QString sName); /// @title Ribbon信号触发 /// @param pCtrl触发的子控件 /// @param pInfo关联的Ribbon配置信息(来自xml) /// @param listValues显示部分 /// @param listIDs void sigRibbonGetListValues(QWidget* pCtrl, iRibbonXmlCmd* pInfo, QStringList& listValues, QStringList& listIDs, int& nCurSel); /// @title Ribbon信号触发(允许外界对SplitBtton进行调整) /// @param pCtrl触发的子控件 /// @param pInfo关联的Ribbon配置信息(来自xml) /// @param listNames 英文Name /// @param listTexts 中文 /// @param listIcons 图标 /// @param bChanged 是否改变 void sigRibbonAdjustSplitBtns(QWidget* pCtrl, iRibbonXmlCmd* pInfo, QStringList& listNames, QStringList& listTexts, QStringList& listIcons, bool& bChanged); void sigRibbonListWxCurChanged(QWidget* pCtrl, iRibbonXmlCmd* pInfo, int nCurSel); void sigRibbonCheckWxClicked(QWidget* pCtrl, iRibbonXmlCmd* pInfo, bool bSelect); protected: //组控件 iRibbonXmlGroup* m_pGroupXml; // 所有的控件 QVector m_vecSubCtrls; // 所有的控件QACtion QVector m_vecMenuActions; //面板按钮(这个主要用于显示于) QToolButton* m_pGroupBt; //内容区容器(折叠时隐藏,展开时显示) QWidget* m_pContentWx; //主布局 QVBoxLayout* m_pLayoutMain; //折叠状态及命中区域 bool m_bCollapsed; bool m_bHover; QRect m_rcCollapseBtn; //展开宽度缓存(用于自动折叠/展开) int m_nCachedExpandedW; // 折叠前记录本来就隐藏的控件ID QStringList m_listHiddenIDs; // 弹出过程中标志,防止 setParent 引起的 hide 触发恢复逻辑 bool m_bPopupShowing; };