• 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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    这里的 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("保存");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    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);// 也可以集成按钮。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    3、状态栏

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

    • 有且仅有一个
    • **位置:**最下面
    • 可以在底部的左边也可以在底部的右边
    // 放标签控件
    QLabel * label = new QLabel("提示信息", this);
    stBar->addWidget(label);
    
    // 底部右侧状态栏
    QLabel *rightLabel = new QLabel("右侧信息", this);
    stBar->addPermanentWidget(rightLabel);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

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

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

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

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

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

    6、实例

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

    6.1 mainwindow.cpp代码

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

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    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("你要干啥???");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87

    6.2 效果

    请添加图片描述

  • 相关阅读:
    Docker详解
    Shell之练习一
    Redis 6学习笔记(上)
    世界杯将至,体育类加密项目迎来春天?
    【C/C++笔试练习】——数组名和&数组名、switch循环语句、数据在计算机中的存储顺序、字符串中找出连续最长的数字串、数组中出现次数超过一半的数字
    Postgresql源码(88)简单复习HOT更新流程
    MOSFET 选型
    C++标准模板(STL)- 类型支持 (数值极限,min_exponent10,max_exponent,max_exponent10)
    基于QtAv及ffmpeg开发的视频播放器
    coreldraw2022新版本新功能介绍cdr2022
  • 原文地址:https://blog.csdn.net/m0_58699417/article/details/128020662