Qt (9)【Qt窗口 —— 如何在窗口中创建菜单栏和工具栏】

时间:2024-10-23 10:05:48

阅读导航

  • 引言
  • 一、Qt窗口简介
  • 二、如何在窗口中创建菜单栏
    • 1. 创建菜单栏
    • 2. 在菜单栏中添加菜单
    • 3. 创建菜单项
    • 4. 在菜单项之间添加分割线
  • 三、如何在窗口中创建工具栏
    • 1. 创建工具栏
    • 2. 设置停靠位置
    • 3. 设置浮动属性
    • 4. 设置移动属性

引言

在上一篇文章中,我们深入探讨了Qt框架中一些常用控件的使用方法,解锁了这些基础组件如何为我们的应用程序增添丰富的视觉展示与用户交互能力。今天,我们将踏上一段新的探索之旅,聚焦于Qt窗口设计的另一个关键方面——菜单栏与工具栏的创建与集成。菜单栏作为应用程序的导航中心,为用户提供了快速访问程序功能的途径;而工具栏则以其直观的操作按钮,进一步简化了用户的操作流程。两者相辅相成,共同构建了应用程序的用户界面骨架。

一、Qt窗口简介

????**Qt 窗口是通过QMainWindow类来实现的。**

QMainWindow 是 Qt 框架中用于实现主窗口程序的一个核心类,它继承自 QWidget 类,并提供了一个预定义的布局,非常适合构建用户界面的主框架。QMainWindow 包含多个关键组件,这些组件共同构成了一个典型的应用程序窗口界面,如文本编辑器或图片编辑器。这些组件包括:

  • 菜单栏(Menu Bar):位于窗口顶部,用于提供应用程序的主要命令和操作选项。
  • 工具栏(Tool Bars):可选的,位于菜单栏下方,包含了一组快速访问工具按钮,以便用户执行常用操作。
  • 浮动窗口(Dock Widgets):可停靠的窗口部件,如侧边栏或属性面板,提供额外的功能或信息,用户可以*调整其位置或使其浮动。
  • 状态栏(Status Bar):位于窗口底部,用于显示应用程序的当前状态或提供额外信息给用户。
  • 中心部件(Central Widget):占据主窗口的主要区域,用于显示应用程序的核心内容或用户的主要工作区域。

????下图为 QMainWindow 中各组件所处的典型位置示意图:

在这里插入图片描述
这样的布局为开发者提供了一个强大而灵活的基础,以便创建功能丰富、用户友好的应用程序界面,后面我会详细介绍每一个组件。

二、如何在窗口中创建菜单栏

Qt中的菜单栏是通过QMenuBar这个类来实现的。一个主窗口最多只有⼀个菜单栏。位于主窗口顶部、主窗口标题栏下面。

菜单栏中包含菜单。菜单中包含菜单项。

在这里插入图片描述

1. 创建菜单栏

菜单栏的创建可以借助于QMainWindow类提供的menuBar()函数来实现。menubar()函数原型如下:

QMenuBar *menuBar() const;

使用方法:

QMenuBar* menuBar = new QMenuBar(this); // 创建菜单栏对象并设置父对象为当前窗口  
this->setMenuBar(menuBar); // 将菜单栏设置到当前窗口中

2. 在菜单栏中添加菜单

使用QMenu类创建一个新的菜单项,并通过该菜单项实例调用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);

3. 创建菜单项

在Qt中,并没有一个专门的类直接对应于菜单项,但可以通过QAction类来抽象出公共的动作,这些动作可以很容易地被添加到菜单中、工具栏上或是作为快捷键等。因此,在Qt中创建菜单项时,通常会先创建QAction对象来定义菜单项的行为(如触发时执行的槽函数),然后再将这些QAction对象添加到QMenu中,从而实现在菜单中添加菜单项的目的。

// 创建菜单项  
QAction *actl = new QAction("open");  
QAction *act2 = new QAction("close");  
QAction *act3 = new QAction("create");
  
// 将菜单项添加到菜单上  
menu1->addAction(actl);  
menu1->addAction(act2);  
menu1->addAction(act3);

???????? 注意QAction可以给菜单栏使用,也可以给工具栏使用。

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

在菜单项之间可以添加分割线以增强可读性,这种分割线是通过QMenu类提供的addSeparator()函数来实现的。

// 创建菜单项  
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);

在这里插入图片描述

三、如何在窗口中创建工具栏

工具栏是应用程序中的一个可选区域,用于集成各种功能并通过快捷键快速访问。它的存在并非必须,应用程序可以包含多个工具栏,也可以完全不包含。工具栏是一个灵活可移动的界面组件,其构成元素多样,但通常以图标按钮的形式展现,为用户提供直观的操作界面,如下示意图所示。
在这里插入图片描述

1. 创建工具栏

QMainWindow类中,你可以通过调用addToolBar()函数来创建并添加一个工具栏到主窗口。每当你想要增加一个新的工具栏时,都需要单独调用一次addToolBar()函数。

例如,如果你想要在主窗口中添加两个工具栏,你将需要分别调用addToolBar()函数两次,每次调用都会创建一个新的工具栏并将其添加到主窗口中。

QToolBar *toolBarl = new QToolBar(this);  
QToolBar *toolBar2 = new QToolBar(this);  
this->addToolBar(toolBarl);  
this->addToolBar(toolBar2);

2. 设置停靠位置

工具栏的停靠位置设置可以通过两种主要方式来实现,第一种方式是在创建工具栏的同时直接指定其停靠位置,另一种是通过QToolBar类提供的setAllowedAreas()方法设置。

⭕方式⼀:创建工具栏的同时指定其停靠的位置

在创建工具栏的同时,可以通过调用相应的函数来设置工具栏的停靠位置,但如果不特别指定,工具栏的默认位置通常是在窗口的最上方。对于工具栏允许停靠的区域,setAllowedAreas()函数允许开发者定义工具栏可以停靠的窗口区域,包括左侧、右侧、顶部、底部,或者所有这些区域的组合。

  • Qt::LeftToolBarArea:工具栏停靠在窗口的左侧。
  • Qt::RightToolBarArea:工具栏停靠在窗口的右侧。
  • Qt::TopToolBarArea:工具栏停靠在窗口的顶部(默认位置)。
  • Qt::BottomToolBarArea:工具栏停靠在窗口的底部。
  • Qt::AllToolBarAreas:工具栏可以停靠在上述任何一个位置。
QToolBar *toolBarl = new QToolBar(this);  
QToolBar *toolBar2 = new QToolBar(this);
// 创建工具栏的同时,指定工具栏在左侧显示  
this->addToolBar(Qt::LeftToolBarArea, toolBarl);  
// 创建工具栏的同时,指定工具栏在右侧显示  
this->addToolBar(Qt::RightToolBarArea, toolBar2);

创建工具栏时指定停靠位置则是通过addToolBar()方法的重载版本直接实现,这种方法更加直观和方便,尤其是在初始布局设计阶段。

⭕方式二:使用QToolBar类提供的setAllowedAreas()函数设置停靠位置

QToolBar *toolBarl = new QToolBar(this);
QToolBar *toolBar2 = new QToolBar(this);
this->addToolBar(toolBarl);
this->addToolBar(toolBar2);
// 只允许在左侧停靠
toolBarl->setAllowedAreas(Qt::LeftToolBarArea);
// 只允许在右侧停靠
toolBar2->setAllowedAreas(Qt::RightToolBarArea);

通过调用QToolBar类的setAllowedAreas()函数来动态设置工具栏可以停靠的区域,这样可以在应用程序运行时根据用户需求或界面布局的变化来灵活调整工具栏的位置。

????????注意:在创建工具栏的同时指定其停靠的位置,指的是程序运行时工具栏默认所在的位置;而使用setAllowedAreas()函数设置停靠位置,指的是工具栏允许其所能停靠的位置。

3. 设置浮动属性

工具栏的浮动属性可以通过QToolBar类提供的setFloatable()函数来设置。setFloatable()函数的原型为:

void setFloatable(bool floatable);

其中参数floatable用于指定工具栏是否可以浮动:

  • 当参数为true时,表示工具栏可以浮动。
  • 当参数为false时,表示工具栏不可以浮动。
QToolBar *toolBarl = new QToolBar(this);  
QToolBar *toolBar2 = new QToolBar(this);  
this->addToolBar(Qt::LeftToolBarArea, toolBarl);  
this->addToolBar(Qt::RightToolBarArea, toolBar2);  
toolBarl->setFloatable(true); // 允许工具栏浮动  
toolBar2->setFloatable(false); // 不允许工具栏浮动

4. 设置移动属性

设置工具栏的移动属性可以通过QToolBar类提供的setMovable()函数来实现。setMovable()函数的原型为:

void setMovable(bool movable);

参数:

  • true:允许工具栏移动。
  • false:禁止工具栏移动。

???? 注意:如果工具栏被设置为不可移动状态(即movable参数为false),则任何尝试改变其停靠位置的操作都将不会生效。因此,设置工具栏的移动属性在某种意义上起到了一个总开关的作用,控制着工具栏是否能够被用户重新定位。

QToolBar *toolBarl = new QToolBar(this);  
QToolBar *toolBar2 = new QToolBar(this);  
this->addToolBar(Qt::LeftToolBarArea, toolBarl);  
this->addToolBar(Qt::RightToolBarArea, toolBar2);  
toolBarl->setMovable(true); // 允许移动  
toolBar2->setMovable(false); // 不允许移动