效果图
我自定义了两个类HelpMenu,CGUIMenuButton,
HelpMenu重写了mouseMoveEvent事件,是为了让鼠标超出按钮的大小之后菜单要消失,
CGUIMenuButton重写了enterEvent(让鼠标进入的时候显示菜单),mousePressEvent(去除点击按钮才出菜单的设置),mouseReleaseEvent(同样去除点击按钮才出菜单的设置),
话不多说上代码:
.h
enum MenuButtonBorder
{
YES,
No,
};
class HelpMenu : public QMenu
{
Q_OBJECT
public:
HelpMenu();
~HelpMenu();
void mouseMoveEvent(QMouseEvent* event);
signals:
void clicked();
private:
};
class LBCOSTGUI_EXPORT CGUIMenuButton : public QPushButton
{
Q_OBJECT
public:
static int MenuItemHeight;
CGUIMenuButton(QString str, MenuButtonBorder type, QWidget* pParent);
~CGUIMenuButton();
public:
void GUIMenuButtonAddAction(QStringList str);
void enterEvent(QEvent* e);
void mousePressEvent(QMouseEvent* e);
void mouseReleaseEvent(QMouseEvent *e);
public slots:
void MenuClickedSlot();
protected:
private:
HelpMenu *m_pMenu;
MenuButtonBorder m_type;
};
.cpp
const int MoveMinY = -23;
const int MoveMaxX = 79;
const int MenuBtnHeight = 30;
int CGUIMenuButton::MenuItemHeight = 0;
HelpMenu::HelpMenu()
{
}
HelpMenu::~HelpMenu()
{
}
void HelpMenu::mouseMoveEvent(QMouseEvent* event)
{
QPointF position = event->localPos();
double x = position.x();
double y = position.y();
if ((x < 0 || y < MoveMinY) || (x > MoveMaxX || y > CGUIMenuButton::MenuItemHeight))
{
setVisible(false);
}
}
CGUIMenuButton::CGUIMenuButton(QString str, MenuButtonBorder type, QWidget* pParent)
: QPushButton(pParent)
{
m_type = type;
this->setText(str);
if (m_type == MenuButtonBorder::YES)
this->setStyleSheet("QPushButton::menu-indicator{image:none;}");//不显示下拉三角
else if (m_type == MenuButtonBorder::No)
this->setFlat(true);
m_pMenu = new HelpMenu();
}
CGUIMenuButton::~CGUIMenuButton()
{
}
void CGUIMenuButton::GUIMenuButtonAddAction(QStringList str)
{
if (str.length() != 0)
{
MenuItemHeight = MenuBtnHeight * str.length();
for each (QString s in str)
{
QAction *pAction = new QAction(s);
if (m_type == MenuButtonBorder::No)
{
pAction->setCheckable(true);
}
pAction->setObjectName(s);
m_pMenu->addAction(pAction);
m_pMenu->addSeparator();
connect(pAction, SIGNAL(triggered()), this, SLOT(MenuClickedSlot()));
}
this->setMenu(m_pMenu);
}
}
void CGUIMenuButton::MenuClickedSlot()
{
if (sender()->objectName() == u8"插入分部")
{
qDebug() << u8"插入分部";
}
else if (sender()->objectName() == u8"插入定额")
{
qDebug() << u8"插入定额";
}
m_pMenu->setVisible(false);
}
void CGUIMenuButton::enterEvent(QEvent * e)
{
showMenu();
}
void CGUIMenuButton::mousePressEvent(QMouseEvent * e)
{
}
void CGUIMenuButton::mouseReleaseEvent(QMouseEvent * e)
{
}