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++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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;
};