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