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


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"));
    

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DieSnowK

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值