#pragma once //#include //#include //#include //#include //#include #include "Defines.h" #include "iPlugin_global.h" class QAction; // 实现拆分按钮,该类借鉴AI class I_PLUGIN_EXPORT ZxSplitButton : public QToolButton { Q_OBJECT public: // bUpDown 是上下还是左右布局 explicit ZxSplitButton(QWidget *parent = 0, \ bool bUpDown = true); ~ZxSplitButton(); /// @brief 创建拆分窗体 /// @param sz 默认大小 /// @param listNames 英文Name /// @param listTexts 中文 /// @param listIcons 图标 /// @param nDefault 默认点中 void initUI(QSize sz, \ QStringList& listNames, \ QStringList& listTexts, \ QStringList& listIcons, \ int nDefault = 0); signals: // 点击主或次菜单项,均触发 void sbActionClicked(QString sName); protected: void mouseMoveEvent(QMouseEvent *); void mousePressEvent(QMouseEvent *); void leaveEvent(QEvent *); void mouseReleaseEvent(QMouseEvent *); void paintEvent(QPaintEvent *); void _drawBackground(QPainter* pPainter); void _drawSeparator(QPainter* pPainter); void _drawBorders(QPainter* pPainter); void _drawTextAndIcons(QPainter* pPainter); void _drawArrow(QPainter* pPainter); QRect getBoundsOf(bool bMain); private slots: // 菜单项 void onMenuTriggered(QAction *action); // 菜单内部,popup相关 void onMenuAboutToShow(); void onMenuAboutToHide(); private: /// @brief 添加菜单项 /// @param sName 英文Name /// @param sText 中文 /// @param sIcon 图标 /// @param bChecked 是否Checked void addAction(QString sName, \ QString sText, \ QString sIcon, \ bool bChecked); //int currentActionId() const; //void setCurrentActionId(int actionId); //void clearActions(); //int actionCount() const; QIcon getCurrentIcon() const; QString getCurrentText() const; // 判断点所在区域 bool isPointInMainArea(const QPoint& pos) const; bool isPointInSubArea(const QPoint& pos) const; private: // 是上下还是左右布局 // 上下布局时,上为Main,下为Sub // 左右布局时,左为Main,右为Sub bool m_bUpDown; // 菜单项 QMenu* m_pMenu; QList m_listActions; struct ActionInfo { QString name; QString text; QIcon icon; }; QList m_listActionInfos; // 当前对应 QString m_sCurCheckedName; // 内部变量控制 bool m_bHoveringMain; //鼠标Hover主Main还是次Sub bool m_bHoveringSub; bool m_bArrowUp; //对于箭头,总是上下显示 bool m_bMenuIsPopup; //当前菜单是否Popup bool m_bPressed; //是否摁下 // 次Sub部分的Span // 对于上下布局,是下侧部分的高 // 对于左右布局,是右侧部分的宽 int m_nSubPartSpan; // 箭头部分的大小,按正方形考虑 int m_nArrowWH; };