Qt应用开发(基础篇)——菜单栏 QMenuBar

news2024/11/28 17:49:44

一、前言

        QMenuBar类继承于QWidget,该类提供了一个水平菜单栏

菜单栏使用

        QMenuBar菜单栏,顾名思义是菜单QMenu和动作QAction的容器,一般在软件的顶部经常会见到它。菜单栏包含了一系列下拉的菜单,使用addMenu()函数添加QMenu菜单,使用addAction()函数添加QAction动作。菜单栏不需要布局,它会自动将自己的几何图形设置到父类控件的顶部,并在父类控件调整大小同步调整自身。

        创建主窗口QMainWindows样式的程序中,它自带了菜单栏,使用menuBar()可以得到菜单栏QMenuBar指针,然后你就可以直接添加QMenu或者QAction,例如:

QAction *newAct = new QAction("copy");
QMenu *fileMenu = menuBar()->addMenu(tr("&File"));
fileMenu->addAction(newAct);

        而QMenu对与文本、图标、小部件和操作action的应用,请参考我另一篇文章,这里就不多介绍了。

        菜单 QMenu

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QMenu *menu = new QMenu();                
    QAction *copyAcy =     menu->addAction(QIcon(QApplication::style()->standardIcon(QStyle::SP_DirOpenIcon)),"copy",this,SLOT(onCopyTriggered()),QKeySequence(Qt::CTRL + Qt::Key_C));
    menu->addAction("cut");
    menu->addSeparator();
    QMenu *sub_menu = new QMenu("help");
    menu->addMenu(sub_menu);
    menu->addMenu(sub_menu);
    sub_menu->addAction("about");
    connect(menu,&QMenu::triggered,[=](QAction *action *action){
        if(action == copyAcy)
        {
            qDebug()<<"copy Triggered";
        }
    });
    this->menuBar()->addMenu(menu);
    this->menuBar()->addMenu("编辑(E)");
}
 
void MainWindow::onCopyTriggered()
{
    qDebug()<<"copy Triggered";
}

 

二、QMenuBar类

1、defaultUp

        该属性表示弹窗的方向,默认弹窗是水平向下,如果该属性设置为true,那么弹窗方向将会变成向上弹出。一般只有菜单栏在底下,才会设置该属性。

bool isDefaultUp() const
void setDefaultUp(bool)

2、nativeMenuBar

        该属性表示菜单栏是否会在支持它的平台上作为原生菜单栏使用。如果此属性为true,则该菜单栏将在本地菜单栏中使用,而不是在其父窗口中。如果为false,则菜单栏保留在窗口中。目前只有在macOS上生效,如果没有这类系统的需求,就不需要关注了。

bool isNativeMenuBar() const
void setNativeMenuBar(bool nativeMenuBar)

3、公共函数

1)actionAt

        返回参数pt位置的的操作action指针,如果不存在或者是分隔符,则返回空指针。

QAction *actionAt(const QPoint &pt) const

2)actionGeometry

        返回参数action的矩形QRect。

QRect actionGeometry(QAction *act) const

        在上面的示例中我们添加如下代码,这样我们就可以得到某action的触发范围,得到这些信息可以和actionAt()配合使用。

this->menuBar()->addMenu("编辑(E)");
QAction *testAct = this->menuBar()->addAction("调试(D)");
qDebug()<<this->menuBar()->actionGeometry(testAct).x()
        <<this->menuBar()->actionGeometry(testAct).y()
        <<this->menuBar()->actionGeometry(testAct).width()
        <<this->menuBar()->actionGeometry(testAct).height();

3)addAction

        添加一个动作action,可以直接指定动作触发的时候接收的槽函数,参考上例。

QAction *addAction(const QString &text)
QAction *addAction(const QString &text, const QObject *receiver, const char *member)
QAction *addAction(const QString &text, const Obj *receiver, PointerToMemberFunctionOrFunctor method)
QAction *addAction(const QString &text, Functor functor)

4)addMenu

        添加一个菜单menu。

QAction *addMenu(QMenu *menu)
QMenu *addMenu(const QString &title)
QMenu *addMenu(const QIcon &icon, const QString &title)

5)insertMenu

        在某个动作action之前插入一个菜单menu。

QAction *insertMenu(QAction *before, QMenu *menu)

 6)insertSeparator

        在某个动作action之前插入一个分隔符。

QAction *insertSeparator(QAction *before)

7)addSeparator

        添加一个分隔符。

 QAction *addSeparator()

8)clear

         清除全部的菜单menu和动作action。

void clear()

9)cornerWidget

        返回位于第一个菜单项左侧或最后一个菜单项右侧的小部件,具体取决于角落。

QWidget *cornerWidget(Qt::Corner corner = Qt::TopRightCorner) const

10)cornerWidget

       将小部件设置为直接显示在第一个菜单项的左侧,或显示在最后一个菜单项的右侧

void setCornerWidget(QWidget *widget, Qt::Corner corner = Qt::TopRightCorner)

        在上面的示例中添加一个toolbutton作为角落小部件:

QToolButton *btn = new QToolButton();
btn->setIcon(QIcon(QApplication::style()->standardIcon(QStyle::SP_TitleBarMenuButton)));
this->menuBar()->setCornerWidget(btn,Qt::TopLeftCorner);

11)setActiveAction

       设置某一个动作action为激活状态。

void setActiveAction(QAction *act)

4、信号

1)hovered

        这个信号在菜单操作被高亮显示时触发,action是导致事件被发送的动作,通常用于更新状态信息。

void hovered(QAction *action)

2)hovered

        当鼠标点击触发属于该菜单栏的菜单中的动作时,触发该信号,action是引起信号触发的动作。

注意:QMenuBar必须拥有QMenu的所有权才能使此信号工作。

void triggered(QAction *action)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1008369.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ICASSP 2023】ST-MVDNET++论文阅读分析与总结

主要是数据增强的提点方式。并不能带来idea启发&#xff0c;但对模型性能有帮助 Challenge&#xff1a; 少有作品应用一些全局数据增强&#xff0c;利用ST-MVDNet自训练的师生框架&#xff0c;集成了更常见的数据增强&#xff0c;如全局旋转、平移、缩放和翻转。 Contributi…

leetcode 673. 最长递增子序列的个数

2023.9.13 做本题之前先复习一下 最长递增子序列 &#xff0c;在此基础上还要加个count数组&#xff0c;用于记录当前下标 最长递增子序列的个数。 本题还是有些难度&#xff0c;日后再来二刷。

lv4 嵌入式开发-7 文件IO(概念、打开、关闭、读、写)

目录 1 文件I/O 介绍 2 文件I/O – 文件描述符fd&#xff08;File Descriptor&#xff09; 3 文件I/O – open 4 文件I/O – close 5 文件I/O – read 6 文件I/O – write 7 文件IO – lseek 8 标准I/O – 思考和练习 掌握文件描述符的含义 1 文件I/O 介绍 什么是文件…

php 实现stripe支付流程

1.申请账号获取密钥key 2.申请创建商品&#xff0c;创建价格&#xff0c;创建支付&#xff0c; //创建商品 public function create_product(){ $_key self::STRIPE_KEY;$stripe new \Stripe\StripeClient($_key);$arr $stripe->products->create([name > $good…

Arcgis多值提取至点所有波段数值一样

Arcgis多值提取至点所有波段数值一样 问题描述 进行多值提取多波段后的结果&#xff0c;所有波段数值都是一样的。 原因 操作流程问题&#xff0c;输入栅格只选择了一个栅格文件 解决方案 实际上&#xff0c;每个波段都会对应一个栅格文件&#xff0c;要把这些添加进去 这…

【网络编程】深入理解TCP协议二(连接管理机制、WAIT_TIME、滑动窗口、流量控制、拥塞控制)

TCP协议 1.连接管理机制2.再谈WAIT_TIME状态2.1理解WAIT_TIME状态2.2解决TIME_WAIT状态引起的bind失败的方法2.3监听套接字listen第二个参数介绍 3.滑动窗口3.1介绍3.2丢包情况分析 4.流量控制5.拥塞控制5.1介绍5.2慢启动 1.连接管理机制 正常情况下&#xff0c;TCP需要经过三…

淘宝/天猫获取商品销量详情 API 返回值说明

item_get_sales-获取商品销量详情 API测试工具 taobao.item_get_sales 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_…

SEO优化排名的技巧与注意点(百度SEO排名的五大注意点)

关键词排名是指在搜索引擎中&#xff0c;用户搜索相关关键词时&#xff0c;网站出现的顺序。SEO优化是提高网站排名的一种方法。优化关键词排名的目的是提高网站流量和知名度。但是要注意遵循百度SEO排名的规则。 下面介绍一下百度SEO排名的五大注意点和优化关键词的六种方式。…

Arcgis提取每个像元的多波段反射率值

Arcgis提取每个像元的多波段反射率值 数据预处理 数据预处理阶段需要对遥感图像进行编辑传感器参数、辐射定标、大气校正、正射校正&#xff0c;具体流程见该文章 裁剪研究区 对于ENVI处理得到的tiff影像&#xff0c;虽然是经过裁剪了&#xff0c;但是还存在黑色的背景值&a…

JDK、eclipse软件的安装

一、打开JDK安装包 二、复制路径 三、点击我的电脑&#xff0c;找到环境变量 四、新建环境 变量名&#xff1a;JAVA_HOME 变量值就是刚刚复制的路径 五、在path中建立新变量 双击path 打印以下文字 最后一直双击确定&#xff0c;安装环境完成。 六、双击eclipse 选择好安装…

Sentinel控制台配置 持久化到nacos

sentinel控制台&#xff0c;使用方便&#xff0c;功能强大。使用官方的jar包&#xff0c;配置不会持久化&#xff0c;sentinel重启后会导致&#xff0c;之前的规则全部丢失&#xff0c;下面一起改造源码实现规则数据的持久化 sentinel源码地址 &#xff08;github访问太慢&am…

React TypeScript 定义组件的各种方式

目录 举例说明1. 使用 class 定义2. 使用函数定义2.1 使用普通函数2.2 使用函数组件 举例说明 比如我们要定义一个计数器 Counter&#xff0c;它包含一个 label 和一个 button&#xff0c;计数器的初始值由外部传入&#xff0c;点击 button 计数加 1: 这虽然是个简单组件&…

第25章_瑞萨MCU零基础入门系列教程之看门狗定时器-WDT

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id728461040949 配套资料获取&#xff1a;https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总&#xff1a; ht…

iOS17正式版9月18日正式发布!怎么更新即将发布的iOS17正式版?

苹果在今天举办的“好奇心上头”发布会结束后&#xff0c;推送了iOS 17和iPadOS 17发布候选版本&#xff08;Release Candidate Version&#xff09;&#xff0c;同时宣布将于9月18日面向iPhone和iPad 用户&#xff0c;推送iOS17/iPadOS 17正式版更新。苹果表示iOS 17的设计理念…

C# Onnx Yolov8 Detect 物体检测

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System…

自动化办公更简单了:新版python-office,有哪些更新?

#职场经验谈# 大家好&#xff0c;这里是程序员晚枫&#xff0c;小破站/小红薯都叫这个名。 去年4月开源了一个Python自动化办公项目&#xff1a;python-office&#xff0c;GitHub和Gitee都能看到。1行代码实现复杂的自动化办公任务&#xff0c;帮助不懂代码的小白&#xff0c;…

处理SQLSyntaxErrorException异常:数据库表 ‘books‘ 不存在;

目录 背景介绍 我的问题中的解决方法 通用方法 背景介绍 今天遇见了这个问题&#xff0c;解决后发出来分享一下 Java应用程序中的SQLSyntaxErrorException&#xff1a;表 bookmanagement.books 不存在问题解决 解决MySQL错误&#xff1a;无法找到表 bookmanagement.books…

Java native 关键字

如你在看 JDK 的源代码的时候&#xff0c;大概率会看到很多方法使用了 native 关键字。 下面是 String 对象 JDK 中的源代码&#xff0c;就带有了一个 native 关键字。 native 是干什么用的 简单来说就是 Java 的 native 方法的实现不是用 Java 实现的&#xff0c;可能在其他…

2023最新AI创作商用ChatGPT源码分享+支持AI绘画

一、SparkAI智能创作系统 SparkAi创作系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文…

OPENCV--实现meanshift图像分割

Meanshift原理 效果图 API # -*- coding:utf-8 -*- """ 作者:794919561 日期:2023/9/13 """ import cv2 import numpy as npimg = cv2.imread("F:\\learnOpenCV\\openCVLearning\\pictures\\Lena.jpg