【Qt】QMainWindow

发布于:2025-03-21 ⋅ 阅读:(29) ⋅ 点赞:(0)

> 作者:დ旧言~
> 座右铭:松树千年终是朽,槿花一日自为荣。

> 目标:了解 QT 的窗口,并能使用窗口中的相关工具。

> 毒鸡汤:有些事情,总是不明白,所以我不会坚持。早安!

> 专栏选自:QT从基础到入门_დ旧言~的博客-CSDN博客

> 望小伙伴们点赞👍收藏✨加关注哟💕💕

一、概念

Qt 窗⼝ 是通过 QMainWindow类 来实现的:

QMainWindow 是⼀个为⽤⼾提供主窗⼝程序的类,继承⾃ QWidget 类,并且提供了⼀个预定义的布局。QMainWindow 包含 ⼀个菜单栏(menu bar)、多个⼯具栏(tool bars)、多个浮动窗⼝(铆接部件)(dock widgets)、⼀个状态栏(status bar) 和⼀个 中⼼部件(central widget),它是许多应⽤程序的基础,如⽂本编辑器,图⽚编辑器等。如下图为 QMainwindow 中 各组件所处的位置:

二、菜单栏

Qt中的菜单栏是通过QMenuBar类实现的:

一个主窗口最多只有一个菜单栏,位于主窗口顶部、主窗口标题栏下面菜单栏中包含菜单,菜单中包含菜单项。

2.1、创建菜单栏

方法一:菜单栏的创建可以借助于QMainWindow类提供的menuBar()函数来实现。

  • 该函数会返回主窗口的菜单栏。若菜单栏不存在,此函数将创建并返回一个空的菜单栏。若菜单栏存在则不会创建,返回已有的菜单栏
  • 若创建项目时勾选了创建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()函数来设置

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()函数来设置。

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

六、结束语

今天内容就到这里啦,时间过得很快,大家沉下心来好好学习,会有一定的收获的,大家多多坚持,嘻嘻,成功路上注定孤独,因为坚持的人不多。那请大家举起自己的小手给博主一键三连,有你们的支持是我最大的动力💞💞💞,回见。