【Qt】自定义QMenu类并绑定槽函数

继承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); 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值