You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nmWTAI-Platform/Include/iBase/iPlugin/ZxSplitButton.h

130 lines
3.1 KiB
C

#pragma once
//#include <QToolButton>
//#include <QMenu>
//#include <QList>
//#include <QPixmap>
//#include <QTimer>
#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<QAction*> m_listActions;
struct ActionInfo {
QString name;
QString text;
QIcon icon;
};
QList<ActionInfo> 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;
};