Qt图形界面编程【3】(QMainWindow窗口类)

630 阅读5分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

一、QMainWindow窗口类

QMainWindow也是一个窗口,相比QWidget来说在窗口中多了很多组件,包含一个菜单栏(menu bar)、多个工具栏(tool bars)、多个铆接部件(dock widgets)、一个状态栏(status bar)及一个中心部件(central widget),是许多应用程序的基础,如文本编辑器,图片编辑器等。

图片.png

1.1 菜单栏

菜单栏里面有很多菜单,菜单里面有很多菜单项

图片.png

菜单栏类:
    在QMainWindow里面设置菜单栏
    QMainWindow->void setMenuBar(QMenuBar *menuBar)
    菜单栏类:QMenuBar
        头文件:
            #include <QMenuBar>
        构造函数:
            QMenuBar(QWidget *parent = nullptr)
菜单:
    在菜单栏中添加菜单
        QMenuBar -> 
            QMenu *addMenu(QMenu *menu)
            QMenu *addMenu(const QString &title)
     菜单类:QMenu
         头文件:#include <QMenu>
         创建菜单:QMenu(const QString &title, QWidget *parent = nullptr) 

菜单项:
    添加菜单项
        QMenu --> 
            QAction * addAction(const QString &text)
            viod addAction(QAction *action)
     菜单项类:QAction  
         头文件:#include <QAction>
         创建菜单项:QAction(const QString &text, QObject *parent = nullptr)     
#include "mainwindow.h"
#include <QMenuBar> //菜单栏
#include <QMenu> //菜单
#include <QAction> //菜单项
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    //**********设置窗口属性***************
    this->setWindowTitle("含有很多组件的窗口");
    this->setFixedSize(1200, 800);

    //*************菜单栏*****************
    //创建菜单栏
    QMenuBar *menubar = new QMenuBar(this);
    //将菜单栏添加到窗口中
    this->setMenuBar(menubar);

    //创建菜单添加到菜单栏中
    QMenu *menuFile = new QMenu("文件", this);
    //将菜单添加到菜单栏中
    menubar->addMenu(menuFile);
    QMenu *menuEdit = new QMenu("编辑", this);
    menubar->addMenu(menuEdit);
    QMenu *menuBuild = new QMenu("构建", this);
    menubar->addMenu(menuBuild);

    //创建菜单项
    QAction *actNew = new QAction("新建文件或项目", this);
    QAction *actOpen = new QAction("打开文件或项目", this);
    QAction *actSave = new QAction("保存文件", this);
    QAction *actClose = new QAction("关闭文件", this);

    //在菜单中添加菜单项
    menuFile->addAction(actNew);
    menuFile->addAction(actOpen);
    //设置分割线
    menuFile->addSeparator();
    menuFile->addAction(actSave);
    menuFile->addSeparator();
    menuFile->addAction(actClose);

    //设置菜单项的快捷方式
    actNew->setShortcut(QKeySequence(tr("Ctrl+H")));
    actSave->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_F));

    //给菜单项设置信号并处理
    connect(actNew, &QAction::triggered, [=](){
        qDebug()<< "新建文件或项目";
    });

    connect(actSave, &QAction::triggered, [=](){
        qDebug()<< "保存文件";
    });
}

MainWindow::~MainWindow()
{
}

1.2 工具栏

添加工具栏到窗口:
     QMainWindow-->
         void addToolBar(Qt::ToolBarArea area, QToolBar *toolbar)
             area:设置默认停靠的位置
                 Qt::LeftToolBarArea  左边停靠
                 Qt::RightToolBarArea 右边停靠
                 Qt::TopToolBarArea 上边停靠
                 Qt::BottomToolBarArea 下边停靠
         void addToolBar(QToolBar *toolbar)
    工具栏类:QToolBar
        头文件:#include <QToolBar>
        QToolBar(const QString &title, QWidget *parent = nullptr)

    //创建工具栏
    QToolBar *toolbar = new QToolBar("工具栏", this);
    //将工具栏添加到窗口
    //this->addToolBar(toolbar); //默认在窗口上方停靠
    //设置默认在左边停靠
    this->addToolBar(Qt::LeftToolBarArea, toolbar);

    //设置工具栏允许停靠的区域
    toolbar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);
    //设置是否允许工具栏浮动
    toolbar->setFloatable(false);

    //创建菜单项并添加到工具栏
    QAction *actWel = new QAction("欢迎", this);
    QAction *actEdit = new QAction("编辑", this);
    QAction *actDebug = new QAction("Debug", this);
    toolbar->addAction(actWel);
    toolbar->addSeparator();
    toolbar->addAction(actEdit);
    toolbar->addSeparator();
    toolbar->addAction(actDebug);

1.3 状态栏

QMainWindow-->
    添加状态栏
    void setStatusBar(QStatusBar *statusbar)
    
状态栏类:QStatusBar
    头文件:#include <QStatusBar>
    QStatusBar(QWidget *parent = nullptr)
    //创建状态栏
    QStatusBar *statusbar = new QStatusBar(this);
    //将状态栏添加到窗口上
    this->setStatusBar(statusbar);

    //在状态栏中设置组件
    QLabel *label = new QLabel("欢迎大家来华清远见学习", this);
    //在状态栏左边添加
    statusbar->addWidget(label);

    QLineEdit *lineedit = new QLineEdit("请在此处输入", this);
    statusbar->addWidget(lineedit);

    QPushButton *button1 = new QPushButton("搜索", this);
    statusbar->addWidget(button1);

    QPushButton *button2 = new QPushButton("问题", this);
    //在状态栏右边添加
    statusbar->addPermanentWidget(button2);

    QPushButton *button3 = new QPushButton("应用程序输出", this);
    statusbar->addPermanentWidget(button3);

1.4 铆接部件

铆接部件一般就是窗口中的浮动窗口

QMainWindow:
    添加铆接部件
    void addDockWidget(Qt::DockWidgetArea area, QDockWidget *dockwidget)
        area:
            Qt::LeftDockWidgetArea 左边停靠
            Qt::RightDockWidgetArea 右边停靠
            Qt::TopDockWidgetArea 上边停靠 
            Qt::BottomDockWidgetArea 下边停靠
QDockWidget:
    头文件:#include <QDockWidget>
    QDockWidget(const QString &title, QWidget *parent = nullptr, Qt::WindowFlags flags = Qt::WindowFlags())            
    //创建铆接部件
    QDockWidget *dockwidget = new QDockWidget("这是一个铆接部件", this);
    //将铆接部件添加到窗口
    this->addDockWidget(Qt::TopDockWidgetArea, dockwidget);

1.5 中心部件

中心部件没有专门的类,任意控件都可以作为中心部件(必须是QWidget以及他的子类才可以)

QMainWindow:
    添加中心部件
    void setCentralWidget(QWidget *widget)
    //将文本编辑器作为中心部件
    //创建文本编辑器
    QTextEdit *textedit = new QTextEdit("当前文本编辑器作为中心部件", this);
    //将其作为中心部件添加到窗口
    this->setCentralWidget(textedit);

1.6 所有代码

#include "mainwindow.h"
#include <QMenuBar> //菜单栏
#include <QMenu> //菜单
#include <QAction> //菜单项
#include <QDebug>
#include <QToolBar> //工具栏
#include <QStatusBar> //状态栏
#include <QPushButton>
#include <QLineEdit>
#include <QLabel>
#include <QDockWidget> //铆接部件
#include <QTextEdit>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    //**********设置窗口属性***************
    this->setWindowTitle("含有很多组件的窗口");
    this->setFixedSize(1200, 800);

    //*************菜单栏*****************
    //创建菜单栏
    QMenuBar *menubar = new QMenuBar(this);
    //将菜单栏添加到窗口中
    this->setMenuBar(menubar);

    //创建菜单添加到菜单栏中
    QMenu *menuFile = new QMenu("文件", this);
    
    //将菜单添加到菜单栏中
    menubar->addMenu(menuFile);
    QMenu *menuEdit = new QMenu("编辑", this);
    menubar->addMenu(menuEdit);
    QMenu *menuBuild = new QMenu("构建", this);
    menubar->addMenu(menuBuild);

    //创建菜单项
    QAction *actNew = new QAction("新建文件或项目", this);
    QAction *actOpen = new QAction("打开文件或项目", this);
    QAction *actSave = new QAction("保存文件", this);
    QAction *actClose = new QAction("关闭文件", this);

    //在菜单中添加菜单项
    menuFile->addAction(actNew);
    menuFile->addAction(actOpen);
    //设置分割线
    menuFile->addSeparator();
    menuFile->addAction(actSave);
    menuFile->addSeparator();
    menuFile->addAction(actClose);

    //设置菜单项的快捷方式
    actNew->setShortcut(QKeySequence(tr("Ctrl+H")));
    actSave->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_F));

    //给菜单项设置信号并处理
    connect(actNew, &QAction::triggered, [=](){
        qDebug()<< "新建文件或项目";
    });

    connect(actSave, &QAction::triggered, [=](){
        qDebug()<< "保存文件";
    });

    //******************工具栏***************************
    //创建工具栏
    QToolBar *toolbar = new QToolBar("工具栏", this);
    //将工具栏添加到窗口
    //this->addToolBar(toolbar); //默认在窗口上方停靠
    //设置默认在左边停靠
    this->addToolBar(Qt::LeftToolBarArea, toolbar);

    //设置工具栏允许停靠的区域
    toolbar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);
    //设置是否允许工具栏浮动
    toolbar->setFloatable(false);

    //创建菜单项并添加到工具栏
    QAction *actWel = new QAction("欢迎", this);
    QAction *actEdit = new QAction("编辑", this);
    QAction *actDebug = new QAction("Debug", this);
    toolbar->addAction(actWel);
    toolbar->addSeparator();
    toolbar->addAction(actEdit);
    toolbar->addSeparator();
    toolbar->addAction(actDebug);

    //******************状态栏***************************
    //创建状态栏
    QStatusBar *statusbar = new QStatusBar(this);
    //将状态栏添加到窗口上
    this->setStatusBar(statusbar);

    //在状态栏中设置组件
    QLabel *label = new QLabel("欢迎大家来华清远见学习", this);
    //在状态栏左边添加
    statusbar->addWidget(label);

    QLineEdit *lineedit = new QLineEdit("请在此处输入", this);
    statusbar->addWidget(lineedit);

    QPushButton *button1 = new QPushButton("搜索", this);
    statusbar->addWidget(button1);

    QPushButton *button2 = new QPushButton("问题", this);
    //在状态栏右边添加
    statusbar->addPermanentWidget(button2);

    QPushButton *button3 = new QPushButton("应用程序输出", this);
    statusbar->addPermanentWidget(button3);

    //******************铆接部件***************************
    //创建铆接部件
    QDockWidget *dockwidget = new QDockWidget("这是一个铆接部件", this);
    //将铆接部件添加到窗口
    this->addDockWidget(Qt::TopDockWidgetArea, dockwidget);

    //*******************中心部件**********************
    //将文本编辑器作为中心部件
    //创建文本编辑器
    QTextEdit *textedit = new QTextEdit("当前文本编辑器作为中心部件", this);
    //将其作为中心部件添加到窗口
    this->setCentralWidget(textedit);
}

MainWindow::~MainWindow()
{
}

执行结果

图片.png