[Qt][Qt窗口][上]详细讲解

ops/2024/10/9 15:20:58/

目录


0.前言

  • Qt窗⼝是通过QMainWindow类来实现的
    • QMainWindow是⼀个为⽤⼾提供主窗⼝程序的类,继承⾃QWidget
  • QMainWindow提供了⼀个预定义的布局
    • QMainWindow包含⼀个菜单栏(menubar)、多个⼯具栏(toolbars)、多个浮动窗⼝(铆接部件)(dockwidgets)、⼀个状态栏(statusbar)和⼀个中⼼部件(centralwidget)
  • 它是许多应⽤程序的基础,如⽂本编辑器,图⽚编辑器等
    请添加图片描述

1.菜单栏

0.是什么?

  • Qt中的菜单栏是通过QMenuBar这个类来实现的
    • ⼀个主窗⼝最多只有⼀个菜单栏,位于主窗⼝顶部、主窗⼝标题栏下⾯
    • 菜单栏(QMenuBar)中包含菜单(QMenu),菜单中包含菜单项(QAction)
      请添加图片描述

1.创建菜单栏

  • 方式一:借助于QMainWindow类提供的menuBar()来实现(更安全)
    • 函数原型QMenuBar* menuBar() const
    • 功能:如果QMenuBar已经存在,直接获取并返回,如果不存在,就先创建一个新的,再返回
    // 创建菜单栏
    QMenuBar* menubar = menuBar();// 将菜单栏放入窗口中
    this->setMenuBar(menubar);
    
  • 方式二:在堆上动态创建
    QMenuBar* menubar = new QMenuBar(this);// 将菜单栏放入窗口中
    this->setMenuBar(menuBar);
    

2.在菜单栏中添加菜单

  • 创建菜单,并通过QMenuBar提供的addMenu()来添加菜单
    // 创建菜单栏
    QMenuBar* menubar = menuBar();// 将菜单栏放入窗口中
    this->setMenuBar(menubar);// 创建菜单
    QMenu* menu1 = new QMenu("文件");
    QMenu* menu2 = new QMenu("编辑");
    QMenu* menu3 = new QMenu("视图");// 添加菜单到菜单栏
    menuBar->addMenu(menu1);
    menuBar->addMenu(menu2);
    menuBar->addMenu(menu3);
    
  • 菜单也可以添加子菜单,通过QMenu提供的addMenu()来添加子菜单
    QMenuBar* menuBar = new QMenuBar();
    this->setMenuBar(menuBar);QMenu* menuParent = new QMenu("父菜单");
    QMenu* menuChild = new QMenu("子菜单");menuBar->addMenu(menuParent);
    menuParent->addMenu(menuChild);QAction* act1 = new QAction("菜单项1");
    QAction* act2 = new QAction("菜单项2");
    menuChild->addAction(act1);
    menuChild->addAction(act2);QMenu* menuChild2 = new QMenu("子菜单2");
    menuChild->addMenu(menuChild2);
    

3.创建菜单项

  • 在Qt中,并没有专⻔的菜单项
  • 可以通过QAction类,抽象出公共的动作,如在菜单中添加菜单项
    • QAction可以给菜单栏使⽤,也可以给⼯具栏使⽤
        // 创建菜单项QAction* act1 = new QAction("open");QAction* act2 = new QAction("close");QAction* act3 = new QAction("create");// 将菜单项添加到菜单上menu1->addAction(act1);menu1->addAction(act2);menu1->addAction(act3);// 可以通过connect给action添加信号槽,以实现功能connect(action1, &QAction::triggered, this, &MainWindow::handle);connect(action5, &QAction::triggered, this, &MainWindow::close);
    

4.给菜单和菜单项设置快捷键

  • 方式一:通过给文本中添加类似&A这样的操作,就是添加了快捷键alt + A
    • &这个符号并不会在界面上显示
    • 示例
      QMenu* menu1 = new QMenu("文件 (&F)");
      QMenu* menu2 = new QMenu("编辑 (&E)");
      QMenu* menu3 = new QMenu("视图 (&V)");
      QMenu* menu4 = new QMenu("关于 (&A)");QAction* act1 = new QAction("act1 (&Q)");
      QAction* act2 = new QAction("act2 (&W)");
      QAction* act3 = new QAction("act3 (&E)");
      QAction* act4 = new QAction("act4 (&R)");
      
  • 方式二:通过QShortCut类实现,不过相对麻烦

5.在菜单项之间添加分割线

  • 添加分割线是通过QMenu类提供的addSeparator()来实现的
  • 分割线添加的位置,和菜单项和分割线的add顺序有关
        // 创建菜单项QAction* act1 = new QAction("open");QAction* act2 = new QAction("close");QAction* act3 = new QAction("create");// 将菜单项添加到菜单上menu1->addAction(act1);menu1->addSeparator(); // 在"open"和"close"中间添加分割线menu1->addAction(act2);menu1->addAction(act3);
    

6.给菜单和菜单项添加图标

  • 添加图标需要使用到QIcon
    • 如果QMenu是长在QMenuBar
      • 给菜单添加图标后,该菜单只会显示这个图标,而不会显示其文本(图标覆盖了文本)
    • 如果QMenu是子菜单
      • 图标和文本都能显示
    QMenu* menu = new QMenu("菜单");
    menu->setIcon(QIcon(":/open.png"));QAction* act1 = new QAction("菜单项1");
    action1->setIcon(QIcon(":/open.png"));
    


http://www.ppmy.cn/ops/95096.html

相关文章

ARM/Linux嵌入式面经(二四):国光电器

一面(群面) (1)常规的自我介绍 一个既专业又能够吸引面试官注意力的自我介绍模板如下。但是请根据自己的实际经历和技能进行适当调整和补充: 尊敬的面试官,您好!我是[您的姓名],非常荣幸有机会参加这次嵌入式系统工程师的面试。我毕业于[毕业院校],主修[专业名称],在…

Spring 02: Bean概览

Spring Bean是什么? 在 Spring 中,Bean 是一个由 Spring IoC(控制反转)容器管理的对象。Bean 通常通过在 XML 配置文件、Java 配置类或基于注解的方式定义,并由容器负责创建和配置。Spring 容器负责管理 Bean 的整个生…

Grafana 可视化监控和告警

前言 在现代分布式系统和云原生环境中,为了确保复杂的分布式系统和服务的高可用性、可靠性和性能,通常采用实时可视化监控和分析,实现故障快速响应、资源优化和安全保障,从而提升用户满意度和运营效率。 在目前主流的解决方案中…

这 2 个 GitHub 项目,YYDS!

01 🧠 构建你的第二大脑:SuperMemory 在这个信息爆炸的时代,我们每天都在互联网上浏览和保存大量的信息,但往往这些宝贵的数据就像被扔进了黑洞,再也没有被回顾和利用。 SuperMemory 开源项目应运而生,旨在…

C语言第20天笔记

文件操作 概述 什么是 文件 文件时保存在外存储器上(一般代指磁盘,也可以是U盘、移动硬盘等)的数据的集合。 文件操作体现在哪几个方面 1. 文件内容的读取 2. 文件内容的写入 数据的读取和写入可被视为针对文件进行输入和输出的操作&a…

微服务实战系列之玩转Docker(十)

前言 我们知道Docker的“使命”是为了快速完成应用的迁移和部署。为提升它的战斗能力,Docker官方携手发布了Docker Swarm—— 一个快速完成Docker集群构建的利器。那么请先回忆一下本系列第八篇(重点compose)和第九篇(重点networ…

MySQL 安装与配置指南

MySQL 是一种广泛使用的关系型数据库管理系统,为各种应用程序提供高效的数据存储和管理解决方案。本文将介绍如何在不同的操作系统中安装 MySQL,以及如何进行基本的配置,以确保数据库系统的最佳性能和稳定性。 一、环境准备 1.1 系统要求 …

Android持久化技术—文件存储

Android持久化技术—文件存储 文件存储是Android中最基本的一种数据存储方式,它不对存储的内容进行任何的格式化处理,所有数据都是原封不动地保存到文件当中的,因而它比较适合用于存储一些简单的文本数据或二进制数据。如果你想使用文件存储…