Qt菜单QMenu和菜单栏QMenuBar及自定义菜单用法

目录
  • 一、常规用法
    • 1.1原理讲解
    • 1.2添加常规菜单栏和菜单用法代码
  • 二、继承QWidgetAction自定义菜单项用法
    • 2.1原理讲解
    • 2.2代码示例
  • 三、将QMenu当QWidget挂载一个布局用法
    • 3.1原理详解
    • 3.2示例代码
  • 参考内容:

QMenu和QMenuBar是Qt中的菜单类和菜单栏类,其中,菜单QMenu挂载在菜单栏QMenuBar上。本文主要总结QMenu的三种常用用法,分别为常规用法、继承QWidgetAction自定义菜单项用法、将QMenu当QWidget挂载一个布局用法。

下面对每种用法进行原理讲解和代码总结。

一、常规用法

1.1原理讲解

QMenuBar是菜单栏,QMenu是菜单,菜单QMenu是挂载在菜单栏QMenuBar上的,相当于菜单栏QMenuBar是一个容器,菜单QMenu是容器中的其中一项,或者说QMenuBar内的子集全部是菜单QMenu,如下图所示:

1.2添加常规菜单栏和菜单用法代码

#include <QMenu>
#include <QAction>
#include <QMenuBar>
#include <QVBoxLayout>

void Widget::on_pushButton_clicked()
{
    QMenu *menu=new QMenu("菜单:常规");
    QAction *action1=new QAction(QIcon(":/resource/image/向右箭头.jpg"),"action1");
    QAction *action2=new QAction(QIcon(":/resource/image/向右箭头.jpg"),"action2");
    QList<QAction*> list;
    list.append(action1);
    list.append(action2);
    menu->addActions(list);
    QMenuBar *menuBar=new QMenuBar;
    menuBar->addMenu(menu);
    menuBar->addSeparator();    //分隔栏
    ui->verticalLayout->addWidget(menuBar);
}

二、继承QWidgetAction自定义菜单项用法

2.1原理讲解

当我们需要自定义菜单里面的每一项时,也就是需要自定义的菜单项内容。菜单项就是菜单里面的子集,如下图所示:

此时我们希望添加的action最好是一个QWidget,那样就可以任意布局了。Qt提供了这样的一个类QWidgetAction。该类继承于QAction,因此对于任何挂载QAction希望自定义界面的需求,都可以用QWidgetAction替代QAction,进行自定义界面定制。

调用QWidgetAction的方法有两种,一个中直接当成QAction用,只是在创建对象的时候,一定要关联父控件为QMenu或者this;调用完后,设置函数void  QWidgetAction::setDefaultWidget(QWidget *w);设置自定义的QWidget界面,然后用菜单像添加QAction一样添加QWidgetAction对象即可。另一种方式是继承QWidgetAction,在继承子类构造函数中设计要定义的QWidget布局,下面的代码也是用继承QWidgetAction的方法。

2.2代码示例

分别添加两个类QMyMenu和QMyWidgetAction,其中QMyMenu继承QMenu,QMyWidgetAction继承QWidgetAction。

qmywidgetaction.h

#ifndef QMYWIDGETACTION_H
#define QMYWIDGETACTION_H

#include <QWidgetAction>

class QMyWidgetAction : public QWidgetAction
{
public:
    explicit QMyWidgetAction(QWidget *parent=0);

protected:
    virtual QWidget *createWidget(QWidget *parent);
};

#endif // QMYWIDGETACTION_H

qmywidgetaction.cpp

#include "qmywidgetaction.h"
#include <QPushButton>
#include <QSplitter>
#include <QLabel>
#include <QLineEdit>
#include <QPixmap>
#include <QMouseEvent>
#include <QHBoxLayout>
#include <QDebug>

QMyWidgetAction::QMyWidgetAction(QWidget *parent):QWidgetAction(parent)
{
}

QWidget *QMyWidgetAction::createWidget(QWidget *parent)
{
    QLabel* lab = new QLabel("label1");
    QPushButton *button1=new QPushButton("button1");
    QHBoxLayout *hlayout=new QHBoxLayout;
    hlayout->setMargin(0);
    hlayout->setSpacing(0);
    hlayout->addWidget(lab);
    hlayout->addWidget(button1);
    QWidget* widget = new QWidget(parent); //如果写成 QSplitter* sp = new QSplitter;  就无法显示!!!
    widget->setLayout(hlayout);
    connect(button1,&QPushButton::clicked,[this](bool){qDebug()<<"单击按钮!";});
    return widget;
}

qmymenu.h

#ifndef QMYMENU_H
#define QMYMENU_H

#include <QMenu>
#include <QMouseEvent>

class QMyMenu : public QMenu
{
public:
    explicit QMyMenu(const QString &title, QWidget *parent = Q_NULLPTR);

protected:
};

#endif // QMYMENU_H

qmymenu.cpp

#include "qmymenu.h"
#include <QAction>

QMyMenu::QMyMenu(const QString &title, QWidget *parent):QMenu(title,parent) //初始化子类构造函数
{

}

在按钮槽函数调用如下代码即可

#include "qmywidgetaction.h"
#include "qmymenu.h"
#include <QAction>
#include <QMenuBar>
#include <QVBoxLayout>

void Widget::on_pushButton_3_clicked()
{
    QMyMenu *menu= new QMyMenu("菜单:继承QWidgetAction用法");
    QAction *action1=new QAction(QIcon(":/resource/image/向右箭头.jpg"),"1");   //设置图标和内容
    menu->addAction(action1);
    QMyWidgetAction *myWidgetAction=new QMyWidgetAction(menu);
    menu->addSeparator();   //添加分割线
    menu->addAction(myWidgetAction);
    QMenuBar *menuBar=new QMenuBar(this);
    menuBar->setStyleSheet("QMenuBar{background-color:red}"
                           "QMenuBar:hover{background-color:blue}");
    menuBar->addMenu(menu);
    ui->verticalLayout->addWidget(menuBar);
    ui->verticalLayout->addStretch();
}

结果如下图所示

三、将QMenu当QWidget挂载一个布局用法

3.1原理详解

QMenu是继承QWidget的,故我们可以当成QWidget一样进行布局调用,在布局上添加我们自定义的界面。

class Q_WIDGETS_EXPORT QMenu : public QWidget
{}

3.2示例代码

void Widget::on_pushButton_2_clicked()
{
    QMenu *menu=new QMenu("菜单:当Widget用,添加一个布局");
    QAction *action1=new QAction(QIcon(":/resource/image/向右箭头.jpg"),"action1");
    QAction *action2=new QAction(QIcon(":/resource/image/向右箭头.jpg"),"action2");
    QList<QAction*> list;
    list.append(action1);
    list.append(action2);
    QVBoxLayout *vlayout=new QVBoxLayout;
    vlayout->setContentsMargins(10,0,10,0);
    QPushButton *button1=new QPushButton("11");
    vlayout->addWidget(button1);
    menu->setLayout(vlayout);
    QMenuBar *menuBar=new QMenuBar;
    menuBar->addMenu(menu);
    menuBar->addSeparator();
    ui->verticalLayout->addWidget(menuBar);
}

结果如下图所示:

总结:具体的需要哪种用法,业务需求来定。但是,要是自定义菜单项的话,我倾向使用第三种,当QMenu当成一个QWidget来用最简单省事,而且很容易做出各种QSS样式表效果。

参考内容:

https://blog.csdn.net/naibozhuan3744/article/details/80855818(参考:QMenu用法)

https://blog.csdn.net/lengyuezuixue/article/details/81123516(参考:QWidgetAction直接用法)

https://blog.csdn.net/lengyuezuixue/article/details/81123516(参考:QWidgetAction继承用法)

https://blog.csdn.net/HYNzhl/article/details/77542421(参考:QWidgetAction重写虚函数createWidget)

https://blog.csdn.net/ly305750665/article/details/53558935(参考:自定义QMenu)

https://www.cnblogs.com/newstart/p/4478689.html(参考:设置QMenuBar属性)

https://bbs.csdn.net/topics/390276550(参考:主动隐藏菜单和主动显示菜单)

https://www.cnblogs.com/swarmbees/p/5634650.html(参考:QWidgetAction用法)

https://blog.csdn.net/peppereggfriedrice/article/details/78861115(参考:QMenu样式表QSS)

https://bbs.csdn.net/topics/391821575(参考:QMenu样式表QSS)

https://www.bbsmax.com/A/kvJ3OWeXJg/(参考:Qt所有样式表,翻译版)

到此这篇关于Qt菜单QMenu和菜单栏QMenuBar及自定义菜单用法的文章就介绍到这了,更多相关Qt菜单QMenu和菜单栏QMenuBar内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Qt5中QML自定义环形菜单/环形选择框的实现

    Qt5 中本身提供了扇形菜单 PieMenu,属于 QtQuick.Extras 模块,这个模块是拓展自 QtQuick.Control1 的,QtQuick.Control1 在 Qt5 高版本被废弃,并在 Qt6 移除. 不过我们也可以用 QtQuick.Control2 的组件自定义样式来实现环形或扇形的菜单和选择框.主要思路就是使用 PathView 来替换默认的 ListView,再改下弹框的背景样式. ItemDelegate 需要设置给 ComboBox 或者 Menu,而不是 V

  • C/C++ Qt Tree与Tab组件实现分页菜单功能

    虽然TreeWidget组件可以实现多节点的增删改查,但多节点操作显然很麻烦,在一般的应用场景中基本上只使用一层结构即可解决大部分开发问题,TreeWidget组件通常可配合TabWidget组件,实现一个类似于树形菜单栏的功能,当用户点击菜单栏中的选项时则会跳转到不同的页面上. 首先在Qt的Ui编辑界面左侧加入TreeWidget组件,右侧加入TabWidget组件,将页面中的TabWidget组件增加指定页,效果如下. 在MainWindow::MainWindow主函数中我们对其中的两个组

  • C/C++ Qt 给ListWidget组件增加右键菜单功能

    在上一篇博文<C/C++ Qt ListWidget 列表框组件应用>中介绍了ListWidget组件的基本使用技巧,本次将给ListWidget组件增加一个右键菜单,当用户在ListWidget组件中的任意一个子项下右键,我们让其弹出这个菜单,并根据选择提供不同的功能. 为了增加菜单,我们首先需要在程序全局增加QAction其中每一个QAction则代表一个菜单选项指针. // 全局下设置增加菜单 QAction *NewAction; QAction *InsertAction; QAct

  • C/C++ Qt ToolBar菜单组件的具体使用

    ToolBar工具栏在所有窗体应用程序中都广泛被使用,使用ToolBar可以很好的规范菜单功能分类,用户可根据菜单栏来选择不同的功能,Qt中默认自带ToolBar组件,当我们以默认方式创建窗体时,ToolBar就被加入到了窗体中,一般是以QToolBar的方式存在于对象菜单栏,如下所示. QToolBar组件在开发中我遇到了以下这些功能,基本上可以应对大部分开发需求了,这里就做一个总结. 顶部工具栏ToolBar组件的定义有多种方式,我们可以直接通过代码生成,也可以使用图形界面UI拖拽实现,但使

  • Qt菜单QMenu和菜单栏QMenuBar及自定义菜单用法

    目录 一.常规用法 1.1原理讲解 1.2添加常规菜单栏和菜单用法代码 二.继承QWidgetAction自定义菜单项用法 2.1原理讲解 2.2代码示例 三.将QMenu当QWidget挂载一个布局用法 3.1原理详解 3.2示例代码 参考内容: QMenu和QMenuBar是Qt中的菜单类和菜单栏类,其中,菜单QMenu挂载在菜单栏QMenuBar上.本文主要总结QMenu的三种常用用法,分别为常规用法.继承QWidgetAction自定义菜单项用法.将QMenu当QWidget挂载一个布局

  • 微信公众帐号开发-自定义菜单的创建及菜单事件响应的实例

    微信开发公众平台自定义菜单需要花钱认证才能实现,不想花钱只能玩测试账号了,不过这并不影响开发.我的开发都是基于柳峰老师的微信公众平台应用开发做的. 只要我们使用公众平台测试账号就可以开发自定义菜单了,比较方便,测试账号开放了很多接口,很方便. 在开发自定义菜单的时候可以参考微信公众平台开发者文档的自定义菜单创建. 一.自定义菜单 1.自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单. 2.一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以"..."代替. 3

  • Android编程自定义菜单实现方法详解

    本文实例讲述了Android编程自定义菜单实现方法.分享给大家供大家参考,具体如下: 在android开发的过程中系统自带的菜单往往满足不了开发中的一些需求,比如说一排最多只能放置三个菜单,坐多只能放置6个,再多的话就会折叠起来,如果我们想再一排显示4个或5个菜单那么就要自己想办法处理. 这里我用布局的隐藏并加上动画来模拟菜单的效果. 要点: 1.隐藏和显示菜单,我使用了一个线性布局把菜单封装起来. <?xml version="1.0" encoding="utf-8

  • php实现微信公众平台账号自定义菜单类

    微信公众平台服务号可申请自定义菜单了,其它的号暂时不支持自定义菜单了,这个不但可以使用api来操作,还可以直接在后台定义菜单与参数哦. 服务号可以申请自定义菜单:使用QQ登录的公众号,可以升级为邮箱登录:使用邮箱登录的公众号,可以修改登录邮箱:群发消息可以同步到腾讯微博.微信公众平台升级:服务号可申请自定义菜单 wx_menu.php <?php //define your token define("TOKEN", "chenxiang");//改成自己的T

  • php微信开发之自定义菜单完整流程

    一.自定义菜单概述 自定义菜单能够帮助公众号丰富界面,让用户更好更快地理解公众号的功能.开启自定义菜单后,公众号界面如图所示: 二.申请自定义菜单 个人订阅号使用微博认证.企业订阅号通过微信认证:可以申请到自定义菜单资格 服务号默认有菜单权限. 三.获得AppId 和AppSecert AppId和AppSecret在开发者中心-开发者ID中,可以找到. 四.获得Access Token 用appid和appsecert获得access token,接口为 https://api.weixin.

  • php微信高级接口调用方法(自定义菜单接口、客服接口、二维码)

    怎么调用微信高级接口 微信高级接口和微信普通接口的区别 后台服务器可以调用微信的接口与微信用户进行讯息的通信,这样的行为就是在调用微信的接口,这些接口是基础接口,你不需要任何付费行为或者身份认证行为就可以调用.但是有一些高级接口,你的微信公众号必须达到一定的权限如通过微信认证才能调用自定义菜单.微信支付等高级功能. 不过微信公众帐号的测试号系统可以应用这些高级接口(微信支付等涉及交易的接口除外). 微信高级接口的调用 微信高级接口的调用需要先调用一个token_access接口,只有先调用这个接

  • php微信开发之自定义菜单实现

    编辑模式和开发模式是有冲突的.所以我们启用微信公众号的开发模式之后,那些菜单是看不到的哦.不过现在个人订阅号是不可以使用高级开发者模式的,如自定义菜单,不过我们还是可以通过测试号来测试一下,然后移代码到服务号. 自定义类型包括如下: 1.click:点击推事件 • 用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event的结构给开发者(参考消息接口指南),并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值与用户进行交互: 2.view:跳转URL • 用户点

  • php微信开发自定义菜单

    目前微信服务号自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单.一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以"..."代替.请注意,创建自定义菜单后,由于微信客户端缓存,需要24小时微信客户端才会展现出来.建议测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果. 目前自定义菜单接口可实现两种类型按钮,如下:  click: 用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event 的结构给开发者(参考消息接口指南),

  • PHP实现微信公众号企业号自定义菜单接口示例

    本文实例讲述了PHP实现微信公众号企业号自定义菜单接口.分享给大家供大家参考,具体如下: define(AppId, "wx666cae44xxxxxx2");//定义AppId,需要在微信公众平台申请自定义菜单后会得到 define(AppSecret, "d77026a714d443a01d0229xxxxxxxx");//定义AppSecret,需要在微信公众平台申请自定义菜单后会得到 include("menu.php");//引入微信类

  • 微信公众号测试账号自定义菜单的实例代码

    自定义菜单接口可实现多种类型按钮,如下: 1.click:点击推事件 用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event 的结构给开发者(参考消息接口指南),并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值与用户进行交互: 2.view:跳转URL 用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的网页URL,可与网页授权获取用户基本信息接口结合,获得用户基本信息. 3.scancode_push:扫码推事件 用户点击按钮后,微信客户

随机推荐