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

embedded/2024/10/9 15:23:39/

目录


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/embedded/94321.html

相关文章

gin获得get和post请求参数,获得请求头信息

获得头信息 router.GET("/", func(c *gin.Context) {name : c.Query("id")fmt.Println(name)Token : c.GetHeader("Token")c.JSON(http.StatusOK, Token)})获得get和post信息 package mainimport ("fmt""github.com/SimonWang00…

《企业微服务实战 · 接口鉴权思路分享》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…

Imagination CPU系列研讨会|RISC-V平台的性能分析和调试

为了让开发者及工程师深入了解 Imagination 的 CPU 产品及相关解决方案,Imagination 将陆续推出 5 期线上研讨会,包含 RISC-V 平台的性能分析和调试;RISC-V 安全和全球平台可信执行环境(TEE);RISC-V 软件生…

Android 图片选择的那些事儿

1.调用系统 使用Intent,部分手机不需要权限,部分手机需要 读SD卡权限,保险起见都读sd卡权限,,,,,,小米社区app,使用的是image的权限,即Android13…

JS【详解】 延迟加载

动态创建标签 动态创建的 <script > let script document.createElement("script"); script.src "path/to/script.js"; document.body.appendChild(script);动态创建的 <img> let img new Image(); img.src path/to/image.jpg; img.onlo…

crm 销售管理系统有哪些?国内外排名前十盘点

本文深入对比的 crm销售管理系统有&#xff1a;1.纷享销客&#xff1b; 2.Zoho CRM&#xff1b; 3.销售易&#xff1b; 4.有赞CRM&#xff1b; 5.Salesforce&#xff1b; 6.HubSpot&#xff1b; 7.简道云CRM&#xff1b; 8.爱客CRM&#xff1b; 9.Apptivo。 如果你正寻找一种方…

Datawhale X 魔搭 AI夏令营第四期 | AIGC文生图——可图Kolors-LoRA风格故事 Task1笔记

Hi&#xff0c;大家好&#xff0c;我是半亩花海。最近在尝试学习AIGC的内容&#xff0c;并报名参加了Datawhale举办的2024年AI第四期夏令营&#xff0c;主要学习内容是从零入门AI生图原理和实践。本次活动基于魔搭社区“可图Kolors-LoRA风格故事挑战赛”进而开展的项目实践学习…

k8s 部署redis

参考&#xff1a; K8S搭建Redis集群_172.31.0.82-CSDN博客 Docker国内设置下载镜像 - 简书 首先创建nfs存储&#xff0c;当redis迁移之后&#xff0c;仍然能够从nfs中获取之前的数据 需要在机器上安装nfs服务&#xff0c;这里我已经安装好了&#xff0c;可以参考这篇文章k…