继承QMenu类自定义菜单
大多数情况下,直接在QWidget类的函数中写以下代码,即可添加菜单,绑定slots函数。
// Widget.h 文件中
private:
QMenu * menu;
QAction* action;
private slots:
void slotfun1();
// Widget.cpp文件中
menu = new MyMenu(this);
action = new QAction("show");
menu->addAction(action);
connect(action ,SIGNAL(triggered(bool)),this,SLOT(slotfun1()));
但我在我的小项目(塔奇克马AI网)中,需要多次用到菜单栏来展现我集成的各种小工具和游戏。因此可能导致菜单功能多,且在多个其它窗口中需要频繁使用。我决定将菜单栏独立出来,便于代码可读性和易修改。
具体思路:定义自己的MyMenu类,继承于QMenu。
头文件代码如下:
#ifndef MYMENU_H
#define MYMENU_H
#include<QMenu>
#include <QWidget>
#include <QAction>
class MyMenu : public QMenu
{
Q_OBJECT // 一定要加Q_OBJECT————否则无法识别信号与槽。
// 但可能造成编译报错:undefined reference to `vtable for MyMenu',
// 此时在Qt Creator 上面菜单栏中build->clear,再重新构建即可。
public:
MyMenu();
explicit MyMenu(QWidget *parent = nullptr);
~MyMenu();
// void changeWin(QWidget *parent) // 修改当前的菜单是属于哪个窗口的
private slots:
void minwidget();
void showwidget();
void closewidget();
private:
// QWidget *win; // 用于记录当前的菜单是属于哪个窗口的
QAction *m_pMinAction;
QAction *m_pShowAction;
QAction *m_pCloseAction;
};
#endif // MYMENU_H
MyMenu类实现如下
#include "mymenu.h"
#include<QApplication>
MyMenu::MyMenu(): QMenu(nullptr){}
MyMenu::MyMenu(QWidget *parent): QMenu(parent), win(parent){
// 菜单栏
m_pMinAction = addAction("minilize");
m_pShowAction = addAction("show");
m_pCloseAction = addAction("exit");
// connect
connect(m_pMinAction,SIGNAL(triggered(bool)),this,SLOT(minwidget()));
connect(m_pShowAction,SIGNAL(triggered(bool)),this,SLOT(showwidget()));
connect(m_pCloseAction,SIGNAL(triggered(bool)),this,SLOT(closewidget()));
}
void MyMenu::changeWin(QWidget* newWin){
win = newWin;
}
MyMenu::~MyMenu(){
delete m_pMinAction;
delete m_pShowAction;
delete m_pCloseAction;
}
void MyMenu::minwidget(){
win->showMinimized();
// qDebug() << "Custom menu item clicked!";
}
void MyMenu::showwidget(){
win->showNormal();
}
void MyMenu::closewidget(){
QApplication::quit();
}
在Widget中使用
// Widget.h 文件中
private:
MyMenu* menu; // 菜单栏
// Widget.cpp 文件中
menu = new MyMenu(this);