主窗口 (QMainWindow)

主窗口 (QMainWindow)

一. 主窗口概念

  1. 主窗口是与用户进行长时间交互的顶层窗口

  2. 程序的绝大多数功能直接由主窗口提供

  3. 主窗口通常是应用程序启动后显示的第一个窗口

  4. 整个程序由一个主窗口和多个对话框组成

    请添加图片描述

二. Qt中的主窗口(QMainWindow)

  1. QMainWindow是Qt中主窗口的基类
  2. QMainWindow继承于QWidget,是一种容器类型的组件
QObject QWidget QPaintDevice QMainWidow
  1. QMainWindow中的组件布局
    请添加图片描述

三. 主窗口中的菜单

  1. 和菜单相关的组件

    请添加图片描述

  2. 在Qt窗口中创建菜单 请添加图片描述

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    
    #include <QKeySequence>
    #include <QMenuBar>
    #include <QAction>
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    private:
        MainWindow();
        MainWindow(const MainWindow&);
        MainWindow& operator= (const MainWindow&);
    
        bool construct();
        bool initMenuBar();
        bool initFileMenu(QMenuBar* mb);
        bool makeAction(QAction*& action, QString text, int key);
    public:
        static MainWindow* NewInstance();  //二次构造
        ~MainWindow();
    };
    #endif // MAINWINDOW_H
    
    
    #include "MainWindow.h"
    #include "ui_MainWindow.h"
    #include <QMenu>
    
    MainWindow::MainWindow()
    {
    
    }
    
    
    //由于主窗口这个包含很多组件,这里采用二次构造,防止构造过程中某个组件没有正常构造出来,把之前构造的组件销毁掉,防止内存泄漏
    MainWindow* MainWindow::NewInstance()
    {
        MainWindow* ret = new MainWindow();
    
        if( (ret == NULL) || !ret->construct() )
        {
            delete ret;
            ret = NULL;
        }
    
        return ret;
    }
    
    //主窗口的构造函数
    bool MainWindow::construct()
    {
        bool ret = true;
    
        //初始化菜单栏,菜单栏由下拉菜单组组成
        ret = ret && initMenuBar();
    
        return ret;
    }
    
    //初始化菜单栏
    bool MainWindow::initMenuBar()
    {
        bool ret = true;
        QMenuBar* mb = menuBar();
    
        //初始化下拉菜单组,下拉菜单组由菜单项组成
        ret = ret && initFileMenu(mb);
    
        return ret;
    }
    
    //初始化下拉菜单组
    bool MainWindow::initFileMenu(QMenuBar* mb)
    {
        //定义菜单项
        QMenu* menu = new QMenu("File(&F)");
        bool ret = (menu != NULL);
    
        if( ret )
        {
            QAction* action = NULL;
    
            ret = ret && makeAction(action, "New(N)", Qt::CTRL + Qt::Key_N);
    
            if( ret )
            {
                menu->addAction(action);    // add Action item to Menu
            }
    
            menu->addSeparator();
    
            //传参的方式构造菜单项
            ret = ret && makeAction(action, "Exit(X)", Qt::CTRL + Qt::Key_X);
    
            if( ret )
            {
                menu->addAction(action);    // add Action item to Menu
            }
        }
    
        if( ret )
        {
            mb->addMenu(menu);    // add Menu add to application Menu Bar
        }
        else
        {
            delete menu;
        }
    
    
        return ret;
    }
    
    
    //构造菜单项,
    bool MainWindow::makeAction(QAction*& action, QString text, int key)
    {
        bool ret = true;
    
        action = new QAction(text, NULL);
    
    
        if( action != NULL )
        {
            //设置菜单项的快捷键
            action->setShortcut(QKeySequence(key));
        }
        else
        {
            ret = false;
        }
    
        return ret;
    }
    
    MainWindow::~MainWindow()
    {
    
    }
    
    
    #include "MainWindow.h"
    
    #include <QApplication>
    #include<QMainWindow>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        MainWindow* w = MainWindow::NewInstance();
        int ret = -1;
    
        if( w != NULL )
        {
            w->show();
    
            ret = a.exec();
        }
    
        return a.exec();
    }
    
    

四. 主窗口中的工具栏

  1. 概念和意义

    应用程序中继承各种功能实现快捷使用的一个区域

    工具栏并不是应用程序中必须存在的组件

    工具栏中的元素可以是各种窗口组件

    工具栏中的元素通常以图标按钮的方式存在

  2. 和工具栏相关的类组件
    请添加图片描述

  3. 实验

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    
    #include <QKeySequence>
    #include <QMenuBar>
    #include <QAction>
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        MainWindow(QWidget *parent = 0);
        ~MainWindow();
    };
    #endif // MAINWINDOW_H
    
    
    #include "MainWindow.h"
    #include "ui_MainWindow.h"
    #include <QMenu>
    #include <QToolBar>
    #include <QAction>
    #include <QIcon>
    #include <QPushButton>
    #include <QLabel>
    #include <QLineEdit>
    
    MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
    {
        QToolBar* tb = addToolBar("Tool Bar");
        QAction* action = new QAction("", NULL);
    
        tb->setFloatable(false);
        tb->setMovable(false);
    
        action->setToolTip("Open");
        action->setIcon(QIcon(":/img/open.png"));
    
        tb->addAction(action);
    
        QPushButton* b = new QPushButton("Button");
     //   QLabel* l = new QLabel("Label");
       // QLineEdit* e = new QLineEdit();
    
        tb->addWidget(b);
     //  tb->addWidget(l);
      //  tb->addWidget(e);
    }
    
    MainWindow::~MainWindow()
    {
    
    }
    
    

    请添加图片描述

五. 主窗口的状态栏

  1. 概念和意义

    状态栏是应用程序输出简要信息的区域

    状态栏一般位于主窗口的最底部

    状态栏中的消息类型有:实时消息(例:当前程序状态)、永久消息(例:程序版本号)、进度消息(例:进度条提示)
    请添加图片描述

  2. 实验

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    
    #include <QKeySequence>
    #include <QMenuBar>
    #include <QAction>
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        MainWindow(QWidget *parent = 0);
        ~MainWindow();
    };
    #endif // MAINWINDOW_H
    
    
    #include "MainWindow.h"
    #include "ui_MainWindow.h"
    #include <QMenu>
    #include <QToolBar>
    #include <QAction>
    #include <QIcon>
    #include <QPushButton>
    #include <QLabel>
    #include <QLineEdit>
    
    MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
    {
        QStatusBar* sb = statusBar();
        QLabel* l = new QLabel("Label");
        QLineEdit* e = new QLineEdit();
        QPushButton* b = new QPushButton("Button");
    
        sb->addPermanentWidget(l);
        sb->addPermanentWidget(e);
        sb->addPermanentWidget(b);
    
        sb->showMessage("Andrea");
    }
    
    MainWindow::~MainWindow()
    {
    
    }
    
    

    请添加图片描述