广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Qt菜单QMenu和菜单栏QMenuBar及自定义菜单用法
  • 251
分享到

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

2024-04-02 19:04:59 251人浏览 安东尼
摘要

目录一、常规用法1.1原理讲解1.2添加常规菜单栏和菜单用法代码二、继承QWidgetAction自定义菜单项用法2.1原理讲解2.2代码示例三、将QMenu当QWidget挂载一个

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内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Qt菜单QMenu和菜单栏QMenuBar及自定义菜单用法

本文链接: https://www.lsjlt.com/news/148620.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Qt菜单QMenu和菜单栏QMenuBar及自定义菜单用法
    目录一、常规用法1.1原理讲解1.2添加常规菜单栏和菜单用法代码二、继承QWidgetAction自定义菜单项用法2.1原理讲解2.2代码示例三、将QMenu当QWidget挂载一个...
    99+
    2022-11-13
  • wpsvba如何自定义菜单栏
    这篇文章主要介绍“wpsvba如何自定义菜单栏”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“wpsvba如何自定义菜单栏”文章能帮助大家解决问题。wpsvba自定义菜单栏的方法:vba插件中提供了菜...
    99+
    2023-07-04
  • JavaScript自定义鼠标右键菜单栏
    在项目中遇到了一个需要自定义鼠标右键菜单栏的功能,今天在这里写个小的方法,可以参考参考,同时欢迎大佬指出存在的问题。 大概思路如下 一、 html结构 <!-- 自定义鼠标右键...
    99+
    2022-11-13
  • Android应用中怎么自定义一个菜单栏
    这期内容当中小编将会给大家带来有关Android应用中怎么自定义一个菜单栏,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在android开发的过程中系统自带的菜单往往满足不了开发中的一些需求,比如说一排最...
    99+
    2023-05-31
    android roi
  • wordpress制作自定义菜单的方法
    要想实现自定义菜单,需要用到的函数是wp_nav_menu(),给这个函数传递一些参数就可以输出自定义菜单菜单,下面简单讲讲如何使用使用这个函数。首先,在主题目录下的functions.php的 <php &hel...
    99+
    2022-06-12
    wordpress
  • Android自定义ViewGroup(侧滑菜单)详解及简单实例
    自定义侧滑菜单的简单实现 不少APP中都有这种侧滑菜单,例如QQ这类的,比较有名开源库如slidingmenu。 有兴趣的可以去研究研究这个开源库。 这里我们将一种自己的实...
    99+
    2022-06-06
    菜单 Android
  • vue原生方法自定义右键菜单
    本文实例为大家分享了vue原生方法自定义右键菜单的具体代码,供大家参考,具体内容如下 1.在需要添加右键的页面,绑定contextmenu事件(阻止浏览器默认事件,添加自定义事件)...
    99+
    2022-11-13
  • 如何在Android项目中自定义侧滑菜单栏
    本篇文章给大家分享的是有关如何在Android项目中自定义侧滑菜单栏,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。自定义侧滑菜单的简单实现不少APP中都有这种侧滑菜单,例如QQ...
    99+
    2023-05-31
    android roi 目中
  • Windows任务栏快捷菜单列表怎自定义添加?
    将桌面众多的软件快捷方式添加到任务栏文件夹中,既可以让桌面整洁,又可以让方便找出要使用的软件。 1、在任意位置新建文件夹,本经验在D盘新建名为“shortcut”的文件夹。 2、将桌面快捷方...
    99+
    2023-06-10
    Windows 任务栏 快捷菜单 自定义 菜单 列表
  • Android 自定义精美界面包含选项菜单 上下文菜单及监听详解流程
    目录activity_main.xml源码main.xml源码main_menu.xmlMainActivity.java源码先放实现结果 activity_main.xml、mai...
    99+
    2022-11-12
  • Android编程自定义菜单实现方法详解
    本文实例讲述了Android编程自定义菜单实现方法。分享给大家供大家参考,具体如下: 在android开发的过程中系统自带的菜单往往满足不了开发中的一些需求,比如说一排最多只能...
    99+
    2022-06-06
    自定义 菜单 方法 Android
  • vue中自定义右键菜单插件怎么用
    今天小编给大家分享一下vue中自定义右键菜单插件怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。演示用法通过npm安装插...
    99+
    2023-06-29
  • 如何自定义win10开始菜单背景和图标
    要自定义Windows 10的开始菜单背景和图标,您可以按照以下步骤进行操作:1. 自定义开始菜单背景:- 在桌面上右键单击,并选择...
    99+
    2023-09-01
    Win10
  • 微信小程序如何实现自定义菜单切换栏tabbar组
    这篇文章将为大家详细讲解有关微信小程序如何实现自定义菜单切换栏tabbar组,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。效果图:wxml代...
    99+
    2022-10-19
  • 怎么使用API创建公众号自定义菜单
    这篇文章主要介绍“怎么使用API创建公众号自定义菜单”,在日常操作中,相信很多人在怎么使用API创建公众号自定义菜单问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用API创建公众号自定义菜单”的疑惑有所...
    99+
    2023-06-04
  • Android编程实现自定义系统菜单背景的方法
    本文实例讲述了Android编程实现自定义系统菜单背景的方法。分享给大家供大家参考,具体如下: 不多说,上图,见代码。 package lab.sodino.menutes...
    99+
    2022-06-06
    自定义 菜单 方法 系统 Android
  • Android 自定义弹出菜单和对话框功能实例代码
    Android 开发当中,可能会存在许多自定义布局的需求,比如自定义弹出菜单(popupWindow),以及自定义对话框(Dialog)。话不多说,直接上图片。 先讲第一种,自定义PopUpWindow1.popupWindowp...
    99+
    2023-05-30
    android 弹出菜单 对话框
  • 如何在微信公众号上使用PHP开发自定义菜单
    如何在微信公众号上使用PHP开发自定义菜单微信公众号是一个非常重要的媒介,很多企业和个人都选择在微信公众号上进行推广和交流。而自定义菜单则是微信公众号中不可或缺的一部分,可以帮助提高用户体验和导航功能。本文将介绍如何使用PHP开发自定义菜单...
    99+
    2023-10-27
    微信公众号 PHP开发 自定义菜单
  • JavaGUI菜单栏与文本和密码及文本域组件使用详解
    目录1.菜单栏1.一级菜单栏2.多级菜单栏2.文本3.密码框4.文本域1.菜单栏 1.一级菜单栏 创建菜单条 JMenuBar创建菜单 JMenu创建菜单项 JMenuItem 总结...
    99+
    2023-03-03
    JavaGUI菜单栏 JavaGUI密码 JavaGUI文本域
  • 如何使用layui实现左侧菜单栏以及动态操作tab项的方法
    这篇文章主要为大家展示了“如何使用layui实现左侧菜单栏以及动态操作tab项的方法”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用layui实现左侧菜单...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作