码迷,mamicode.com
首页 > 其他好文 > 详细

第27课 应用程序中的主窗口

时间:2016-07-31 22:06:47      阅读:288      评论:0      收藏:0      [点我收藏+]

标签:

1. 主窗口的概念

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

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

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

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

2. Qt中的主窗口

(1)Qt开发平台中直接支持主窗口的概念

(2)QMainWindow是Qt中主窗口的基类

(3)QMainWindow继承于QWidget是一种容器类型的组件

技术分享 

3. QMainWindow中封装的秘密

技术分享 

(1)菜单栏(2)工具栏(3)中心组件(4)停靠组件(5)状态栏

4. QMainWindow中的组件布局

技术分享 

5. 主窗口中的菜单

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

技术分享 

(2)在Qt主窗口中创建菜单

QMenuBar* mb = menuBar(); //QMainWidow的成员函数
QMenu* menu = new QMenu("File(&F)");
QAction* action = new QAction("New",NULL);

menu->addAction(action); //将action加入菜单项中

mb->addMenu(menu);  //将菜单项加入MenuBar中

【编程实验】主窗口中创建菜单

//NotePad.pro

技术分享
#-------------------------------------------------
#
# Project created by QtCreator 2016-07-31T21:11:03
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = NotePad
TEMPLATE = app


SOURCES += main.cpp        MainWindow.cpp

HEADERS  += MainWindow.h
View Code

//main.cpp

#include "MainWindow.h"
#include <QApplication>

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 ret;
}

//MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMenuBar>
//#include <QKeySequence>
//#include <QAction>

class MainWindow : public QMainWindow
{
    Q_OBJECT
private:
    //将构造函数、复制构造、赋值函数等私有化
    MainWindow(QWidget *parent = 0);
    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

//MainWindow.cpp

#include "MainWindow.h"
#include <QMenu>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
}

//二阶构造中的第2阶构造
bool MainWindow::construct()
{
    bool ret = true;

    ret = ret && initMenuBar();

    return ret;
}

MainWindow* MainWindow::NewInstance()
{
    MainWindow* ret = new MainWindow();

    if((ret == NULL) || !ret->construct())
    {
        delete ret;
        ret = NULL;
    }

    return ret;
}

//初始化菜单栏
bool MainWindow::initMenuBar()
{
    bool ret = true;
    QMenuBar* mb = menuBar(); //menuBar为QMainWindow的成员变量

    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 to Menu Item
        }

        //水平分隔线
        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 to Menu Bar
    }
    else
    {
        delete menu;
    }

    return ret;
}

//生成菜单项(第1个参数是菜单项对象,第2个参数为显示文本,第3个参数为快捷键)
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()
{

}

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

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

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

6. 小结

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

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

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

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

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

第27课 应用程序中的主窗口

标签:

原文地址:http://www.cnblogs.com/5iedu/p/5723890.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!