【Qt】QMainWindow

目录

一、概念

二、菜单栏

[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);
相关推荐
羊小猪~~1 小时前
数据结构C语言描述2(图文结合)--有头单链表,无头单链表(两种方法),链表反转、有序链表构建、排序等操作,考研可看
c语言·数据结构·c++·考研·算法·链表·visual studio
苏三有春2 小时前
PyQt5实战——UTF-8编码器功能的实现(六)
开发语言·qt
脉牛杂德2 小时前
多项式加法——C语言
数据结构·c++·算法
legend_jz2 小时前
STL--哈希
c++·算法·哈希算法
CSUC2 小时前
【C++】父类参数有默认值时子类构造函数列表中可以省略该参数
c++
Vanranrr2 小时前
C++ QT
java·c++·qt
鸿儒5172 小时前
C++ lambda 匿名函数
开发语言·c++
兆。2 小时前
掌握 PyQt5:从零开始的桌面应用开发
开发语言·爬虫·python·qt
van叶~3 小时前
算法妙妙屋-------1.递归的深邃回响:二叉树的奇妙剪枝
c++·算法
knighthood20013 小时前
解决:ros进行gazebo仿真,rviz没有显示传感器数据
c++·ubuntu·ros