Qt MainWindow窗口部件简介

Qt MainWindow窗口部件简介

QMain窗口类 |Qt小部件 5.15.13

Qt有QMainWindow及其相关类用于主窗口管理。QMainWindow有自己的布局,您可以在其中添加QToolBarQDockWidgetQMenuBarQStatusBar。布局有一个中心区域,可以由任何类型的小部件占据。您可以在下面看到布局的图像。

img

QMainWindow具有单个 (SDI) 或多个 (MDI) 文档界面。您可以使用QMdiArea作为centralWidget在Qt中创建MDI应用程序。

注意: 不支持创建没有中央小部件的QMainWindow。您必须有一个中央小部件,即使它只是一个占位符


使用qmainwindow,什么时候需要用setCentralWidget()?

QMainWindow是QT中的主窗口类,通常用于创建应用程序中的主窗口。setCentralWidget()是QMainWindow类中的一个函数,用于设置主窗口中心的部件。

当需要在主窗口中添加一个中心部件或者更改现有的中心部件时,就需要使用setCentralWidget()函数。这个中心部件通常是应用程序中最重要的部分,像是一个文本编辑器、绘图区域或者一个媒体播放器。

在使用setCentralWidget()函数之前,通常需要先创建一个QWidget或其子类的对象作为中心部件。然后通过调用setCentralWidget()函数将这个对象设置为主窗口的中心部件。

总之,当需要在QMainWindow搭建主框架时,需要使用setCentralWidget()函数。如果需要在主窗口中心添加动态交互的GUI控件等,也需要使用setCentralWidget()。

在使用qtdesigner时,我并没有在哪里设置centralwidget,但是为什么可以运行?

在Qt Designer中,QMainWindow会自动创建一个默认的centralwidget。如果你打开ui文件的 XML 代码,就可以看到类似下面的代码:

<widget class="QMainWindow" name="MainWindow">
  <widget class="QWidget" name="centralwidget"/>
  <widget class="QMenuBar" name="menubar"/>
  <widget class="QStatusBar" name="statusbar"/>
  ...
</widget>

这里的 centralwidget 就是在 Qt Designer 中自动添加的。如果你想自定义 centralwidget,那么可以在 Qt Designer 中手动添加一个 widget,然后将其设置为 QMainWindow 的 centralWidget。但是如果你不需要自定义 centralwidget,也可以直接使用 Qt Designer 默认创建的 centralwidget。

因此,如果你在 Qt Designer 中没有设置 centralwidget,那么 Qt Designer 会默认添加一个 centralwidget,并将其设置为 QMainWindow 的中心部件。否则,你需要在 C++ 代码中使用 setCentralWidget() 函数将自定义的 centralwidget 设置为 QMainWindow 的中心部件。

在 C++ 代码中使用 setCentralWidget() 函数将自定义的 centralwidget 设置为 QMainWindow 的中心部件后,在 Qt Designer 中添加的窗体是不是就不是中心部件了?

是的,在 C++ 代码中使用 setCentralWidget() 函数将自定义的 centralwidget 设置为 QMainWindow 的中心部件后,Qt Designer 中添加的窗体实际上就不再是中心部件了。如果你需要在 C++ 代码中修改中心部件,建议在 Qt Designer 中删除原有的 centralwidget,然后手动创建一个 QWidget,并将其作为 QMainWindow 的中心部件。这样可以保证在 Qt Designer 和 C++ 代码中都能正确获取和设置中心部件。

如果你不想手动创建 QWidget,在 Qt Designer 中也可以通过以下方式将你的自定义窗体设置为中心部件:

  1. 在 Qt Designer 中打开你的窗体;
  2. 选择窗体控件,右键选择 “Promote to…”;
  3. 在 “Promoted Classes” 编辑对话框中,填写 “Promoted class name” 和 “Header file”;
  4. 点击 “Add” 按钮,将你的窗体控件添加到 “Promoted Classes” 编辑框中;
  5. 确定并保存;
  6. 在 QMainWindow 中添加一个 QWidget 控件;
  7. 选择这个 QWidget 控件,将右侧属性视图中的 “promoted class name” 设置为你在第 3 步中填写的类名;
  8. 将 QWidget 控件设置为 QMainWindow 的中心部件。

这样就可以将你的自定义窗体设置为中心部件,同时在 Qt Designer 和 C++ 代码中都能正确获取和设置中心部件。


1、菜单栏

特性如下:

  • 有且仅有一个
  • **位置:**顶部
// 创建菜单 最多只能有一个
QMenuBar * bar = menuBar();
// 将菜单栏放入到窗口处
setMenuBar(bar);

// 创建顶部菜单
QMenu * fileMenu = bar->addMenu("文件");
QMenu * editMenu = bar->addMenu("编辑");

// 创建菜单项
newAction =  fileMenu->addAction("新建");
// 创建多级菜单
fileMenu->addMenu("打开");
// 添加单级菜单
editMenu->addAction("文字");
editMenu->addAction("图片");
//添加分割线
fileMenu->addSeparator();
fileMenu->addAction("保存");

2、工具栏

工具栏特性:

  • 可以有多个
  • 可浮动
  • 可以在任意位置
// 设置工具栏
QToolBar * toolBar = new QToolBar(this);
addToolBar(Qt::LeftToolBarArea, toolBar);
// 设置作用的区域
toolBar->setAllowedAreas(Qt::LeftToolBarArea|Qt::RightToolBarArea);
// 设置不可浮动
toolBar->setFloatable(false);
// 总开关 设置不可移动
toolBar->setMovable(false);

toolBar->addAction(newAction); //QAction * newAction =  fileMenu->addAction("新建");可以把菜单里面的action方法集成到工具栏中
toolBar->addAction("啊哈");

QPushButton * btn = new QPushButton("来啦", this);
toolBar->addWidget(btn);// 也可以集成按钮。

3、状态栏

状态栏就是程序最下面的那一栏,显示当前程序状态

  • 有且仅有一个
  • **位置:**最下面
  • 可以在底部的左边也可以在底部的右边
// 放标签控件
QLabel * label = new QLabel("提示信息", this);
stBar->addWidget(label);

// 底部右侧状态栏
QLabel *rightLabel = new QLabel("右侧信息", this);
stBar->addPermanentWidget(rightLabel);

4、铆接部件(浮动窗口)

铆接部件可以认为是辅助部件

  • 可以是多个
  • 可以再任意位置
// 铆接部件  浮动窗口 
QDockWidget * dockWidget = new QDockWidget("浮动标签", this);
// 初始化铆接部件,需要传入位置和QDockWidget对象
addDockWidget(Qt::BottomDockWidgetArea, dockWidget);
// 设置铆接部件只能上下附着
dockWidget->setAllowedAreas(Qt::TopDockWidgetArea|Qt::BottomDockWidgetArea);

5、中心部件(内容部件)

中心部件是主要内容展示中心。必须有且仅有一个

  • 有且仅有一个
  • 内容展示的主要空间
// 设置中心部件  在这里我们来显示文本控件
QTextEdit * textEdit = new QTextEdit("毛毛来了", this);
setCentralWidget(textEdit);

6、实例

**要求:**点击工具栏的按钮实现更改中心控件的内容

6.1 mainwindow.cpp代码

在mainwindow.cpp中代码如下使用lambda函数和connet函数实现信号和槽

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMenuBar>
#include <QToolBar>
#include <QPushButton>
#include <QStatusBar>
#include <QLabel>
#include <QDockWidget>
#include <QTextEdit>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 重置窗口大小
    resize(600,400);

    // 创建菜单栏 最多只能有一个
    QMenuBar * bar = menuBar();
    // 将菜单栏放入到窗口处
    setMenuBar(bar);

    // 创建菜单
    QMenu * fileMenu = bar->addMenu("文件");
    QMenu * editMenu = bar->addMenu("编辑");

    // 创建菜单项
    QAction * newAction =  fileMenu->addAction("新建");
    fileMenu->addMenu("打开");
    editMenu->addAction("文字");
    editMenu->addAction("图片");
    //添加分割线
    fileMenu->addSeparator();
    fileMenu->addMenu("保存");

    // 设置工具栏
    QToolBar * toolBar = new QToolBar(this);
    addToolBar(Qt::LeftToolBarArea, toolBar);// 将工具栏移至左侧
    // 设置作用的区域
    toolBar->setAllowedAreas(Qt::LeftToolBarArea|Qt::RightToolBarArea);
    // 设置不可浮动
    toolBar->setFloatable(false);
    // 总开关 设置不可移动
    toolBar->setMovable(false);

    toolBar->addAction(newAction);
    toolBar->addAction("啊哈");

    QPushButton * btn = new QPushButton("来啦", this);
    toolBar->addWidget(btn);

    // 设置状态栏 只能有一个
    QStatusBar * stBar = new QStatusBar;
    setStatusBar(stBar);
    // 放标签控件
    QLabel * label = new QLabel("状态栏提示信息", this);
    stBar->addWidget(label);

    QLabel *rightLabel = new QLabel("右侧信息", this);
    stBar->addPermanentWidget(rightLabel);

    // 铆接部件  浮动窗口  可以多个
    QDockWidget * dockWidget = new QDockWidget("浮动标签", this);
    addDockWidget(Qt::BottomDockWidgetArea, dockWidget);
    dockWidget->addAction(newAction);
    // 设置铆接部件只能上下附着
    dockWidget->setAllowedAreas(Qt::TopDockWidgetArea|Qt::BottomDockWidgetArea);

    // 设置中心部件  只能有一个
    QTextEdit * textEdit = new QTextEdit("毛毛来了", this);
    setCentralWidget(textEdit);

    connect(btn, &QPushButton::clicked,this,[=](){
        printText(*textEdit);
    });
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::printText(QTextEdit& text)
{
    text.setText("你要干啥???");
}

6.2 效果

请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值