zoukankan      html  css  js  c++  java
  • Qt中的主窗口之菜单栏

    1、Qt中的主窗口

    • 主窗口为建立应用程序用户界面提供了一个框架
    • Qt开发平台中直接支持主窗口的概念
    • QMainWindow是Qt中主窗口的基类
    • QMainWindow继承于QWidget是一种容器类型的组件
    • QMainWindow只能作为顶层组件

    2、QMainWindow的优势--QMainWindow类拥有自己的布局

     

    3、 主窗口中的菜单

    (1)Qt提供与菜单相关的类组件

    (2)QMenuBar类、QMenu类和QAction类

      ①QMenuBar:QMenuBar类提供了一个水平的菜单栏,可以在此基础上添加不同的QMenu和QAction。一个主窗口只可以有一个菜单栏。

      ②QMenu:菜单栏里面菜单如File、Edit、Format等菜单)或者带有三角形符号的菜单项(表示其下仍有子菜单),可以显示文本和图标,但是并不负责执行操作有点类似label的作用
      ③QAction: Qt 将用户与界面进行交互的元素抽象为一种“动作”,使用QAction类表示。QAction才是真正负责执行操作的部件

      

    联系:

      QMainWindow中可以直接获取它的默认存在的QMenuBar菜单栏对象,向其(QMenuBar菜单栏对象)添加QMenu类型的菜单对象,然后向弹出的菜单中添加QAction类型的动作对象。

    代码:

    QMenuBar* mb = menuBar(); //调用QMainWidow的成员函数menuBar  用该函数就可以得到QMainWindow里面的菜单栏对象即 主窗口里面的菜单栏对象
    QMenu* menu = new QMenu("File(&F)");
    QAction* action = new QAction("New",NULL);
    
    menu->addAction(action); //将action加入菜单项中
    
    mb->addMenu(menu);  //将菜单项加入MenuBar中
    

      

    4、实例

    MainWindow.h

    #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);
    
        bool initMenuBar();
        bool initFileMenu(QMenuBar* mb);
        bool initEditMenu(QMenuBar* mb);
        bool makeAction(QAction*& action, QString text, int key);
    
        ~MainWindow();
    };
    #endif // MAINWINDOW_H
    

      

    /MainWindow.cpp

    #include "mainwindow.h"
    #include <QMenu>
    
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
    {
        initMenuBar();
    }
    
    bool MainWindow::initMenuBar()
    {
        bool ret = true;
        QMenuBar* mb = menuBar();
    
        ret = ret && initFileMenu(mb);
        ret = ret && initEditMenu(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;
    }
    
    bool MainWindow::initEditMenu(QMenuBar* mb)
    {
        QMenu* menu = new QMenu("Edit(&E)");
        bool ret = (menu != NULL);
    
        if( ret )
        {
            QAction* action = NULL;
    
            ret = ret && makeAction(action, "Undo(&U)", Qt::CTRL + Qt::Key_Z);
    
            if( ret )
            {
                menu->addAction(action);
            }
    
            ret = ret && makeAction(action, "Redo(&R)...", Qt::CTRL + Qt::Key_Y);
    
            if( ret )
            {
                menu->addAction(action);
            }
    
    
    
            menu->addSeparator();
    
            ret = ret && makeAction(action, "Select All(&A)", Qt::CTRL + Qt::Key_A);
    
            if( ret )
            {
                menu->addAction(action);
            }
        }
    
        if( ret )
        {
            mb->addMenu(menu);
        }
        else
        {
            delete menu;
        }
    
        return ret;
    }
    
    
    MainWindow::~MainWindow()
    {
    
    }
    

      

    main.cpp

     

    #include "mainwindow.h"
    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
    
        return a.exec();
    }
    

     效果图:

    小技巧:

    快捷键设置action->setShortcut(QKeySequence(key));

      ①QKeySequence:Qt中与快捷键相关的类

      ②Key:Qt中代表键值的常量(如Ctrl+N的常量值为Qt::CTRL + Qt::Key_N)

    5、小结

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

    (2)主窗口通常是应用程序启动后显示的第一个窗口

    (3)QMainWindow是Qt是主窗口的基类

    (4)QMainWindow是一种容器类型的窗口组件

    (5)QMainWindow中封装了菜单栏、工具栏、状态栏等组件

  • 相关阅读:
    最大子数组
    链表插入排序
    链表求和
    有效回文串
    排球比赛计分系统
    超市收银系统
    三层架构
    Wpf+数据库代码封装+策略模式封装
    封装逻辑用策略模式实现
    代码封装
  • 原文地址:https://www.cnblogs.com/zhaobinyouth/p/7643637.html
Copyright © 2011-2022 走看看