Qt之点击鼠标右键创建菜单栏使用(六)

news2024/12/17 20:04:07

Qt开发 系列文章 - menu(六)


目录

前言

一、示例演示

二、菜单栏

1.MenuBar

2.Menu

总结


前言

QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏(menubar)、多个工具栏(toolbars)、一个状态栏(statusbar)及一个中心部件(centralwidget),是许多应用程序的基础。今天本文主要讲解菜单栏QMenuBar和QMenu,其中QMenu可以嵌入到菜单栏QMenuBar中,也可以作为弹出菜单使用。

QMenu是Qt框架中的一个类,用于创建和管理菜单。它提供了丰富的接口来添加菜单项、子菜单以及分隔符。QMenu不仅支持文本菜单项,还支持图标、快捷键和状态提示等功能,这些都可以通过QAction来设置。


一、示例演示

先给出本文示例效果展示,如下。

二、菜单栏

将从两个方面讲解菜单,第一个是示例演示中的MenuBar,在窗口前端添加菜单选项;第二个是在子窗口上通过鼠标点击显示菜单Menu。

1.MenuBar

  • 步骤1

新建一个Qt项目,带UI设计的,不会创建的参考本博主前面的博文,创建完后,双击打开项目。

  • 步骤2

如果如要在菜单中添加图片显示的,可参考这一步操作,如果不如要则跳过该步骤。添加图标首先是将你的图片添加到项目中,图片格式可以是ico、png等等。

在Qt界面上,选择你的项目,右键选择添加现有文件,选择你的图标目录,如下左图所示。将图标全部选中,点击打开添加。添加完后在Qt项目中会见到如下添加图标,见如下右图。

     

  • 步骤3

在Qt项目界面上,双击打开UI设计文件,在QMenuBar上添加如下功能,有主菜单和子菜单选项,自己可以按需添加,如下所示。

上面创建好的选项,在UI界面底部显示全部的内容,具体如下。

  • 步骤4

单击选中其中一个,右键进行编辑,此时可修改为中文,也可以添加步骤2所加的图标。操作完后显示如下左图。

  • 步骤5

要实现相关的按钮功能,例如,在帮助上显示版本信息,操作如下,选中项目,右键选择转到槽函数,选择triggered函数,步骤如下。

     

triggered函数代码如下(示例)。

void MainWindow::on_action_4_triggered()
{
    info = new QTextBrowser;
    info->setWindowTitle("版本信息");
    info->setWindowIcon(QApplication::style()-
                  >standardIcon(QStyle::StandardPixmap::SP_MessageBoxInformation));
    info->setText("版本14.7.0.9802\n系统词频: 630211129\n编译时间: Aug  2 2024 17:00:18");
    info->show();
}
  • 步骤6

上述创建好后,在UI界面左侧,主窗口类处,会有如下变量。

此时在窗口前端添加MenuBar菜单选项已操作完毕,接下面实现在子窗口上通过鼠标点击显示菜单Menu。

2.Menu

  • 步骤1

同样是打开UI设计界面,在UI界面上添加如下①②③,相应的类如下右图。

   

  • 步骤2

要实现相关函数功能,先在头文件上定义相关类,代码如下(示例):

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
private slots:
    void on_action_4_triggered();
protected:
    void InitChart();
    void CreateMenu(QWidget *parent);
    bool eventFilter(QObject *obj, QEvent *event) override;
private:
    Ui::MainWindow *ui;
    QTextBrowser *info;
    QChart *chart;
    QLineSeries *series;
    QMenu *menu_widget;
    QMenu *menu_tab;
    QMenu *menu_tab_2;
};
  • 步骤3

在构造函数上进行参数初始化,和注册事件过滤器、创建菜单变量,并关联到相关子窗口上,代码如下(示例)。

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->toolBar->hide();
    InitChart();
    /*** 注册事件过滤器 ***/
    ui->widget->installEventFilter(this);
    ui->tab->installEventFilter(this);
    ui->tab_2->installEventFilter(this);
    /*** 创建右键菜单 ***/
    CreateMenu(ui->widget);
    CreateMenu(ui->tab);
    CreateMenu(ui->tab_2);
}

bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{
    if(watched == ui->widget) {
        if(event->type() == QEvent::MouseMove) {
            QMouseEvent *pMouseEvent = (QMouseEvent*)event;
            // 功能函数
        }
        if(event->type() == QEvent::MouseButtonPress)
            menu_widget->exec(cursor().pos());  //菜单显示的位置跟随鼠标
    }
    else if (watched == ui->tab) {
        if(event->type() == QEvent::MouseButtonDblClick)
            menu_tab->exec(cursor().pos());
    }
    else if (watched == ui->tab_2) {
        if(event->type() == QEvent::MouseButtonDblClick)
            menu_tab_2->exec(cursor().pos());
    }
    return QObject::eventFilter(watched, event);
}

void MainWindow::CreateMenu(QWidget *parent)
{
    if(parent == ui->widget) {
        menu_widget = new QMenu(parent);//创建右键菜单
        menu_widget->addAction("功能1", this, [=](){fun1();});
        menu_widget->addAction("功能2", this, [=](){fun2();});
        menu_widget->addAction("清空", this, [=](){series->clear();});
        menu_widget->addAction("退出", this, [=](){ui->widget->close();});
        menu_widget->setStyleSheet("background-color: rgb(30, 30, 30);color: rgb(255, 255, 255);"
                            "border-right:2px solid #aaaaaa; "
                            "border-bottom:2px solid #aaaaaa;"
                            "border-left:2px solid #aaaaaa;"
                            "border-top:2px solid #aaaaaa; "
                            "border-radius:5px;"
                            "font: 16pt ""黑体"";"
                            "selection-background-color: rgb(100, 40, 40);");
    }
    else if (parent == ui->tab) {
        menu_tab = new QMenu(parent);//创建右键菜单
        menu_tab->addAction("功能1", this, [=](){fun1();});
        menu_tab->addAction("功能2", this, [=](){fun2();});
        menu_tab->addAction("隐藏", this, [=](){ui->tab->hide();});
        menu_tab->addAction("退出", this, [=](){ui->tab->close();});
        menu_tab->setStyleSheet("background-color: rgb(30, 30, 30);color: rgb(255, 255, 255);"
                            "border-right:2px solid #aaaaaa; "
                            "border-bottom:2px solid #aaaaaa;"
                            "border-left:2px solid #aaaaaa;"
                            "border-top:2px solid #aaaaaa; "
                            "border-radius:5px;"
                            "font: 16pt ""黑体"";"
                            "selection-background-color: rgb(100, 40, 40);");
    }
    else if (parent == ui->tab_2) {
        menu_tab_2 = new QMenu(parent);//创建右键菜单
        menu_tab_2->addAction("功能1", this, [=](){fun1();});
        menu_tab_2->addAction("功能2", this, [=](){fun2();});
        menu_tab_2->addAction("隐藏", this, [=](){ui->tab_2->hide();});
        menu_tab_2->addAction("退出", this, [=](){ui->tab_2->close();});
        menu_tab_2->setStyleSheet("background-color: rgb(30, 30, 30);color: rgb(255, 255, 255);"
                            "border-right:2px solid #aaaaaa; "
                            "border-bottom:2px solid #aaaaaa;"
                            "border-left:2px solid #aaaaaa;"
                            "border-top:2px solid #aaaaaa; "
                            "border-radius:5px;"
                            "font: 16pt ""黑体"";"
                            "selection-background-color: rgb(100, 40, 40);");
    }
}

上述编写完毕后,软件编译运行,显示如下。


总结

博文中相应的工程代码Qt-Case.zip 利用Qt开发软件进行编的例程,为博文提供案例-CSDN文库。

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

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

相关文章

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(一)

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(一) 你好,我是拉依达。 感谢所有阅读关注我的同学支持,目前博客累计阅读 27w,关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析(持续更新)-CSDN博客》已经是 Lin…

IntelliJ IDEA(2024版) 的安装、配置与使用教程:常用配置、创建工程等操作(很详细,你想要的都在这里)

IDEA的安装、配置与使用: Ⅰ、IDEA 的安装:1、IDEA 的下载地址(官网):2、IDEA 分为两个版本:旗舰版 (Ultimate) 和 社区版 (Community)其一、两个不同版本的安装文件:其二、两个不同版本的详细对比: 3、IDE…

MybatisPlus-配置加密

配置加密 目前配置文件中的很多参数都是明文,如果开发人员发生流动,很容易导致敏感信息的泄露。所以MybatisPlus支持配置文件的加密和解密功能。 我们以数据库的用户名和密码为例。 生成秘钥 首先,我们利用AES工具生成一个随机秘钥&#…

深度学习基础--将yolov5的backbone模块用于目标识别会出现怎么效果呢??

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 前言 yolov5网络结构比较复杂,上次我们简要介绍了yolov5网络模块,并且复现了C3模块,深度学习基础–yolov5网络结构简介&a…

数据结构---图(Graph)

图(Graph)是一种非常灵活且强大的数据结构,用于表示实体之间的复杂关系。在图结构中,数据由一组节点(或称为顶点)和连接这些节点的边组成。图可以用于表示社交网络、交通网络、网络路由等场景。 1. 基本概…

人工智能技术的深度解析与推广【人工智能的应用场景】

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默, 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把…

软件开发中 Bug 为什么不能彻底消除

在软件开发中,Bug无法彻底消除的原因主要包括:软件复杂度高、人员认知与沟通受限、需求和环境不断变化、工具与测试覆盖不足、经济与时间成本制约。其中“需求和环境不断变化”尤为关键,因为在实际开发中,业务逻辑随着市场与用户反…

【嵌入式软件】跑开发板的前置服务配置

在嵌入式开发中,通常需要在 开发板和主机之间共享、传输和挂载文件。 这篇文章是关于如何在 Ubuntu 中配置 Samba、TFTP 和 NFS 协议的详细步骤。这些协议分别用于远程文件共享、文件传输和内核挂载文件系统。 如何安装协议: 参考:ubuntu18配置:详细的内容我手写了一份文档。…

CTF 攻防世界 Web: FlatScience write-up

题目名称-FlatScience 网址 index 目录中没有发现提示信息,链接会跳转到论文。 目前没有发现有用信息,尝试目录扫描。 目录扫描 注意到存在 robots.txt 和 login.php。 访问 robots.txt 这里表明还存在 admin.php admin.php 分析 在这里尝试一些 sql…

从YOLOv5到训练实战:易用性和扩展性的加强

文章目录 前言一、模型介绍二、YOLOv5网络结构1.Input(输入端):智能预处理与优化策略2.Backbone(骨干网络):高效特征提取3.NECK(颈部):特征增强与多尺度融合4.Prediction…

Ilya Sutskever发表了对AI未来发展的颠覆性看法

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

Crawl4AI:一个为大型语言模型(LLM)和AI应用设计的网页爬虫和数据提取工具实战

这里写目录标题 一、crawl4AI功能及简介1、简介2、特性 二、项目地址三、环境安装四、大模型申请五、代码示例1.生成markdown2.结构化数据 一、crawl4AI功能及简介 1、简介 Crawl4AI 是一个开源的网页爬虫和数据抓取工具,一个python项目,主要为大型语言…

HuLa——一款基于 Tauri+Vue3 构建的桌面即时通讯应用

文章目录 一、HuLa简介二、技术栈介绍三、安装运行四、界面体验五、开源地址 一、HuLa简介 HuLa 是一个基于 Tauri、Vite 5、Vue 3 和 TypeScript 构建的即时通讯系统。它利用了 Tauri 的跨平台能力和 Vue 3 的响应式设计,结合了 TypeScript 的类型安全特性和 Vite…

websocket_asyncio

WebSocket 和 asyncio 指南 简介 本指南涵盖了使用 Python 中的 websockets 库进行 WebSocket 编程的基础知识,以及 asyncio 在异步非阻塞 I/O 中的作用。它提供了构建高效 WebSocket 服务端和客户端的知识,以及 asyncio 的特性和优势。 1. 什么是 WebS…

《Java核心技术I》Swing用户界面组件

Swing和模型-视图-控制器设计模式 用户界面组件各个组成部分,如按钮,复选框,文本框或复杂的树控件,每个组件都有三个特征: 内容,如按钮的状态,文本域中的文本。外观,颜色&#xff0c…

如何通过递延型指标预测项目的长期成果?

递延型指标(Deferred Metrics)是指那些并不立即反映或直接影响当前操作、决策或行为的指标,而是随着时间的推移,才逐渐显现出影响效果的指标。这类指标通常会在一段时间后反映出来,或者需要一定的周期才能展现其成果或…

uni-app开发AI康复锻炼小程序,帮助肢体受伤患者康复!

**提要:**近段时间我们收到多个康复机构用户,咨询AI运动识别插件是否可以应用于肢力运动受限患者的康复锻炼中来,插件是可以应用到AI康复锻炼中的,今天小编就为您介绍一下AI运动识别插件在康腹锻炼中的应用场景。 一、康复机构的应…

C++(十八)

前言: 本文依据上一篇,继续对C中的函数进行学习。 一,内联函数。 再执行函数代码时,比不使用函数花费了更多时间,因为总结步骤,传递参数和返回值都很花费时间。 因此,在调试小型函数时&…

如何在 Ubuntu 上安装 NodeBB 并使用 Nginx 反向代理

简介 NodeBB 是一款基于 Node.js 的开源论坛软件,为在线社区提供了现代化和响应式的解决方案。在 Ubuntu Linux 上运行的 NodeBB 利用了操作系统的强大性和灵活性,以提供高性能和可扩展性。它结合了 MongoDB 或 Redis 进行数据库管理,使其能…

【UE5 C++课程系列笔记】09——多播委托的基本使用

目录 多播委托——申明委托 一、DECLARE_MULTICAST_DELEGATE 二、DECLARE_DYNAMIC_MULTICAST_DELEGATE 多播委托——绑定委托 一、Add 二、AddStatic 三、AddRaw 四、AddSP 五、AddUObject 六、Remove 七、RemoveAll 多播委托——执行 上一篇:【UE5 C课程…