目录
[2.1 创建菜单栏](#2.1 创建菜单栏)
[2.2 在菜单栏中添加菜单](#2.2 在菜单栏中添加菜单)
[2.3 创建菜单项](#2.3 创建菜单项)
[2.4 在菜单项之间添加分割线](#2.4 在菜单项之间添加分割线)
[3.1 创建工具栏](#3.1 创建工具栏)
[3.2 设置停靠位置](#3.2 设置停靠位置)
[3.3 设置浮动属性](#3.3 设置浮动属性)
[3.4 设置移动属性](#3.4 设置移动属性)
[4.1 状态栏的创建](#4.1 状态栏的创建)
[4.2 显示实时消息](#4.2 显示实时消息)
[4.3 显示永久消息](#4.3 显示永久消息)
[5.1 浮动窗口的创建](#5.1 浮动窗口的创建)
[5.2 设置停靠位置](#5.2 设置停靠位置)
一、概念
QMainWindow是一个为用户提供主窗口程序的类,继承自QWidget类,并且提供了一个预定义的布局。QMainWindow包含一个菜单栏(menu bar)、多个工具栏(tool bars)、多个浮动窗口(铆接部件)(dock widgets)、一个状态栏(status bar)和一个中心部件(central widget),它是许多应用程序的基础,如文本编辑器,图片编辑器等
下图为QMainwindow中各组件所处的位置:
二、菜单栏
Qt中的菜单栏是通过QMenuBar类实现的。一个主窗口最多只有一个菜单栏,位于主窗口顶部、主窗口标题栏下面
菜单栏中包含菜单,菜单中包含菜单项
2.1 创建菜单栏
方法一
菜单栏的创建可以借助于QMainWindow类提供的menuBar()函数来实现
cpp
QMenuBar * menuBar() const
- 该函数会返回主窗口的菜单栏。若菜单栏不存在,此函数将创建并返回一个空的菜单栏。若菜单栏存在则不会创建,返回已有的菜单栏
- 若创建项目时勾选了创建ui文件,则推荐使用本方法,不推荐在堆上创建菜单栏
- 因为在勾选ui文件后会项目会自动创建菜单栏,又在堆上创建的话,会导致自动创建的菜单栏无法释放,造成内存泄漏
cpp
//创建菜单栏
QMenuBar* menubar = menuBar();
//将菜单栏设置进窗口中
this->setMenuBar(menubar);
**方法二:**在堆上动态创建
使用setMenuBar把菜单栏放到窗口中
cpp
//创建菜单栏
QMenuBar* menubar = new QMenuBar(this);
//将菜单栏设置进窗口中
this->setMenuBar(menubar);
2.2 在菜单栏中添加菜单
创建菜单,并通过QMenu提供的addMenu()函数来添加菜单
cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
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);
}
MainWindow::~MainWindow()
{
delete ui;
}
2.3 创建菜单项
在Qt中,并没有专门的菜单项类,可以通过QAction类,抽象出公共的动作
QAction可以给菜单栏使用,也可以给工具栏使用
cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
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);
//创建菜单项
QAction* action1 = new QAction("open");
QAction* action2 = new QAction("close");
QAction* action3 = new QAction("create");
//将菜单项添加到菜单上
menu1->addAction(action1);
menu1->addAction(action2);
menu1->addAction(action3);
}
MainWindow::~MainWindow()
{
delete ui;
}
2.4 在菜单项之间添加分割线
添加分割线是通过QMenu类提供的addSeparator()函数来实现
cpp
menu1->addAction(action1);
menu1->addSeparator();
menu1->addAction(action2);
menu1->addSeparator();
menu1->addAction(action3);
三、工具栏
工具栏是应用程序中集成各种功能实现快捷键使用的一个区域。可以有多个,也可以没有,并不是应用程序中必须存在的组件。它是一个可移动的组件,它的元素可以是各种窗口组件,它的元素通常以图标按钮的方式存在
如下图为工具栏的示意图:
3.1 创建工具栏
调用QMainWindow类的addToolBar()函数来创建工具栏,每增加一个工具栏都需调用一次该函数
如添加两个工具栏:
cpp
QToolBar* toolbar1 = new QToolBar(this);
QToolBar* toolbar2 = new QToolBar(this);
this->addToolBar(toolbar1);
this->addToolBar(toolbar2);
3.2 设置停靠位置
工具栏停靠位置的设置有两种方式。一种是在创建工具栏的同时指定停靠的位置,另一种是通过QToolBar类提供的setAllowedAreas()函数来设置
**方法一:**创建工具栏的同时指定其停靠的位置
- Qt::LeftToolBarArea 停靠在左侧
- Qt::RightToolBarArea 停靠在右侧
- Qt::TopToolBarArea 停靠在顶部
- Qt::BottomToolBarArea 停靠在底部
- Qt::AllToolBarAreas 以上四个位置都可停靠
cpp
QToolBar* toolbar1 = new QToolBar(this);
QToolBar* toolbar2 = new QToolBar(this);
//创建工具栏时,指定工具栏在左侧显示
this->addToolBar(Qt::LeftToolBarArea, toolbar1);
//创建工具栏时,指定工具栏在右侧显示
this->addToolBar(Qt::RightToolBarArea, toolbar2);
**方式二:**使用QToolBar类提供的setAllowedAreas()函数设置停靠位置
cpp
QToolBar* toolbar1 = new QToolBar(this);
QToolBar* toolbar2 = new QToolBar(this);
this->addToolBar(toolbar1);
this->addToolBar(toolbar2);
//只允许在左侧停靠
toolbar1->setAllowedAreas(Qt::LeftToolBarArea);
//只允许在右侧停靠
toolbar2->setAllowedAreas(Qt::RightToolBarArea);
注意:
在创建工具栏时指定其停靠的位置,指的是程序运行时工具栏默认所在的位置;而使用setAllowedAreas()函数设置停靠位置,指的是工具栏允许其所能停靠的位置
3.3 设置浮动属性
工具栏的浮动属性可以通过QToolBar类提供的setFloatable()函数来设置
cpp
void setFloatable (bool floatable)
cpp
QToolBar* toolbar1 = new QToolBar(this);
QToolBar* toolbar2 = new QToolBar(this);
this->addToolBar(Qt::LeftToolBarArea, toolbar1);
this->addToolBar(Qt::RightToolBarArea, toolbar2);
toolbar1->setFloatable(true);//允许工具栏浮动
toolbar2->setFloatable(false);//不允许工具栏浮动
3.4 设置移动属性
设置工具栏的移动属性可以通过QToolBar类提供的setMovable()函数来设置
cpp
void setMovable(bool movable)
注意: 若设置工具栏为不移动状态,则设置其停靠位置的操作就不会生效,所以设置工具栏的移动属性类似于总开关的效果
cpp
QToolBar* toolbar1 = new QToolBar(this);
QToolBar* toolbar2 = new QToolBar(this);
this->addToolBar(Qt::LeftToolBarArea, toolbar1);
this->addToolBar(Qt::RightToolBarArea, toolbar2);
toolbar1->setMovable(true);//允许移动
toolbar2->setMovable(false);//不允许移动
四、状态栏
状态栏是应用程序中输出简要信息的区域。一般位于主窗口的最底部,一个窗口中最多只能有一个状态栏。在Qt中,状态栏是通过QStatusBar类来实现的
在状态栏中可以显示的消息类型有:
- 实时消息:如当前程序状态
- 永久消息:如程序版本号,机构名称
- 进度消息:如进度条提示,百分比提示
4.1 状态栏的创建
状态栏的创建是通过QMainWindow类提供的statusBar()函数来创建
cpp
QStatusBar* stbar = statusBar();
this->setStatusBar(stbar);
4.2 显示实时消息
在状态栏中显示实时消息是通过showMessage()函数来实现
cpp
//状态栏中显示约2秒的"Hello_Qt"
stbar->showMessage("Hello_Qt", 2000);
4.3 显示永久消息
在状态栏中可以显示永久消息,此处的永久消息是通过标签来显示的
cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QStatusBar* stbar = statusBar();
this->setStatusBar(stbar);
//创建标签
QLabel* label = new QLabel("提示消息", this);
//将标签放入状态栏
stbar->addWidget(label);
}
MainWindow::~MainWindow()
{
delete ui;
}
调整显示消息的位置
cpp
//创建标签
QLabel* label2 = new QLabel("右侧提示消息", this);
//将标签放入状态栏
stbar->addPermanentWidget(label2);
五、浮动窗口
在Qt中,浮动窗口也被称为铆接部件。浮动窗口是通过QDockWidget类来实现浮动的功能,浮动窗口一般是位于核心部件的周围,可以有多个
5.1 浮动窗口的创建
浮动窗口的创建是通过QDockWidget类提供的构造方法QDockWidget()函数动态创建的
cpp
//浮动窗口
QDockWidget* dockwidget = new QDockWidget("浮动窗口", this);
//将浮动窗口设置与当前窗口中
this->addDockWidget(Qt::BottomDockWidgetArea, dockwidget);
5.2 设置停靠位置
浮动窗口是位于中心部件的周围。可以通过QDockWidget类中提供setAllowedAreas()函数设置其允许停靠的位置
其中可以设置允许停靠的位置有:
- Qt::LeftDockWidgetArea 停靠在左侧
- Qt::RightDockWidgetArea 停靠在右侧
- Qt::TopDockWidgetArea 停靠在顶部
- Qt::BottomDockWidgetArea 停靠在底部
- Qt::AllDockWidgetAreas 以上四个位置都可停靠
cpp
//只允许上下停靠
dockwidget->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);