【QT】C++ GUI Qt4 学习笔记3

菜单界面的实现。

看书上第三章,好长,好多代码。我敲了半天,想看看效果,结果却显示不出来。仔细一看,发现spreadsheet的实现在第四章。郁闷....

又到官网上下代码,结果居然不能运行。难道是因为我的版本太高了?

只好自己改,把没实现的部分都先忽略掉,即忽略掉具体的功能,只是显示菜单。折腾了半天,搞定了。

总结一下:

创建菜单:

需要再主窗口类中声明

1.QMenu * 代表一个菜单

2.QAction * 代表菜单中的一个动作 一般一个菜单里会有很多歌动作

3.每个动作对应的槽函数

然后在实现中:

QMenu 的创建,拿fileMenu举例:

主要是1.在窗口中生成菜单 2.添加动作 

//文件菜单
    fileMenu = menuBar()->addMenu(tr("&File")); //设置显示的名称 
    fileMenu->addAction(newAction); //添加动作
    fileMenu->addAction(openAction);
    fileMenu->addAction(saveAction);
    fileMenu->addAction(saveAsAction);
    separatorAction = fileMenu->addSeparator(); //插入间隔器
    for(int i = 0; i < MaxRecentFiles; i++)
    {
        fileMenu->addAction(recentFileActions[i]);
    }
    fileMenu->addSeparator();
    fileMenu->addAction(exitAction);

QAction 的创建,主要包括:

1.新建动作

2.设置动作的图标

3.设置快捷键

4.设置提示 (好奇怪,我设置的提示都显示不出来)

5.添加信号和槽的连接 

拿newAction举例:

    newAction = new QAction(tr("&New"),this);
    newAction->setIcon(QIcon(":file/images/icon.jpg"));
    newAction->setShortcut(QKeySequence::New); //有标准化序列的 没有就用 tr("Ctrl + Q") 之类的
    newAction->setStatusTip(tr("Create a new spreadsheet file"));
    connect(newAction, SIGNAL(triggered()),this, SLOT(newFile()));

功能函数:

由于只看看样子,都设成空函数就好了。

创建工具栏:

需要声明 QToolBar *

需要的动作和上面是一样的

创建:

    fileToolBar = addToolBar(tr("&File"));
    fileToolBar->addAction(newAction);
    fileToolBar->addAction(openAction);
    fileToolBar->addAction(saveAction);

创建状态栏:

用 QLabel

 

代码如下:

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "finddialog.h"
#include "gotocelldialog.h"
#include "sortdialog.h"

MainWindow::MainWindow()
{
    //spreadsheet = new Spreadsheet;
    //setCentralWidget(spreadsheet); //设置sheet为主窗口的中央窗口

    //创建主窗口的其他部分

    createActions();
    createMenus();
    //createContextMenu();
    createToolBars();
    //createStatusBar();
    //读取应用程序存储的设置
    //readSettings();
    //find 初始化为空指针
    //findDialog = 0;

    setWindowIcon(QIcon(":file/images/icon.jpg"));
    //setCurrentFile("");
}

void MainWindow::createActions()
{
    /**************File 菜单动作创建***************************/
    //新建
    newAction = new QAction(tr("&New"),this);
    newAction->setIcon(QIcon(":file/images/icon.jpg"));
    newAction->setShortcut(QKeySequence::New);
    newAction->setStatusTip(tr("Create a new spreadsheet file"));
    connect(newAction, SIGNAL(triggered()),this, SLOT(newFile()));
    //打开
    openAction = new QAction(tr("&Open"),this);
    openAction->setIcon(QIcon(":file/images/icon.jpg"));
    openAction->setShortcut(QKeySequence::Open);
    openAction->setStatusTip(tr("Open a file"));
    connect(openAction, SIGNAL(triggered()),this, SLOT(open()));
    //保存
    saveAction = new QAction(tr("&Save"),this);
    saveAction->setIcon(QIcon(":file/images/icon.jpg"));
    saveAction->setShortcut(QKeySequence::Save);
    saveAction->setStatusTip(tr("Save the file"));
    connect(saveAction, SIGNAL(triggered()),this, SLOT(save()));
    //另存为
    saveAsAction = new QAction(tr("&Save As"),this);
    saveAsAction->setIcon(QIcon(":file/images/icon.jpg"));
    saveAsAction->setShortcut(QKeySequence::SaveAs);
    saveAsAction->setStatusTip(tr("Save the file As"));
    connect(saveAsAction, SIGNAL(triggered()),this, SLOT(saveAs()));
    //最近打开的文件

    for(int i = 0; i < MaxRecentFiles; i++)
    {
        recentFileActions[i] = new QAction(this);
        recentFileActions[i]->setVisible(false);
        connect(recentFileActions[i], SIGNAL(triggered()),this,SLOT(openRecentFile()));
    }

    //退出
    exitAction = new QAction(tr("E&xit"),this);
    exitAction->setShortcut(tr("Ctrl+Q"));//没有终止程序的标准化序列键 需要明确指定
    exitAction->setStatusTip(tr("Exit the application"));
    connect(exitAction, SIGNAL(triggered()),this,SLOT(close()));

    /********************Edit 菜单动作创建***************************/
    cutAction = new QAction(tr("Cu&t"), this);
    cutAction->setIcon(QIcon(":file/images/icon.jpg"));
    cutAction->setShortcut(QKeySequence::Cut);
    cutAction->setStatusTip(tr("Cut the current selection's contents "
                               "to the clipboard"));
   // connect(cutAction, SIGNAL(triggered()), spreadsheet, SLOT(cut()));

    copyAction = new QAction(tr("&Copy"), this);
    copyAction->setIcon(QIcon(":file/images/icon.jpg"));
    copyAction->setShortcut(QKeySequence::Copy);
    copyAction->setStatusTip(tr("Copy the current selection's contents "
                                "to the clipboard"));
   // connect(copyAction, SIGNAL(triggered()), spreadsheet, SLOT(copy()));

    pasteAction = new QAction(tr("&Paste"), this);
    pasteAction->setIcon(QIcon(":file/images/icon.jpg"));
    pasteAction->setShortcut(QKeySequence::Paste);
    pasteAction->setStatusTip(tr("Paste the clipboard's contents into "
                                 "the current selection"));
   // connect(pasteAction, SIGNAL(triggered()),
   //        spreadsheet, SLOT(paste()));

    deleteAction = new QAction(tr("&Delete"), this);
    deleteAction->setShortcut(QKeySequence::Delete);
    deleteAction->setStatusTip(tr("Delete the current selection's "
                                  "contents"));
    //connect(deleteAction, SIGNAL(triggered()),
    //        spreadsheet, SLOT(del()));

    //全选
    selectAllAction = new QAction(tr("&All"),this);
    selectAllAction->setShortcut(QKeySequence::SelectAll);
    selectAllAction->setStatusTip(tr("Select all the cells in the 'spreadsheet'"));
    connect(selectAllAction, SIGNAL(triggered()),this, SLOT(selectAll())); //Qt已经实现了全选

    selectRowAction = new QAction(tr("&Row"), this);
    selectRowAction->setStatusTip(tr("Select all the cells in the "
                                     "current row"));
    //connect(selectRowAction, SIGNAL(triggered()),
    //        spreadsheet, SLOT(selectCurrentRow()));

    selectColumnAction = new QAction(tr("&Column"), this);
    selectColumnAction->setStatusTip(tr("Select all the cells in the "
                                        "current column"));
    //connect(selectColumnAction, SIGNAL(triggered()),
    //        spreadsheet, SLOT(selectCurrentColumn()));

    findAction = new QAction(tr("&Find..."), this);
    findAction->setIcon(QIcon(":file/images/icon.jpg"));
    findAction->setShortcut(QKeySequence::Find);
    findAction->setStatusTip(tr("Find a matching cell"));
    connect(findAction, SIGNAL(triggered()), this, SLOT(find()));

    goToCellAction = new QAction(tr("&Go to Cell..."), this);
    goToCellAction->setIcon(QIcon(":file/images/icon.jpg"));
    goToCellAction->setShortcut(tr("Ctrl+G"));
    goToCellAction->setStatusTip(tr("Go to the specified cell"));
    connect(goToCellAction, SIGNAL(triggered()),
            this, SLOT(goToCell()));

    /********************Tools 菜单动作创建***************************/
    recalculateAction = new QAction(tr("&Recalculate"), this);
    recalculateAction->setShortcut(tr("F9"));
    recalculateAction->setStatusTip(tr("Recalculate all the "
                                       "spreadsheet's formulas"));
   // connect(recalculateAction, SIGNAL(triggered()),
   //        spreadsheet, SLOT(recalculate()));

    sortAction = new QAction(tr("&Sort..."), this);
    sortAction->setStatusTip(tr("Sort the selected cells or all the "
                                "cells"));
   // connect(sortAction, SIGNAL(triggered()), this, SLOT(sort()));

   /********************options 菜单动作创建***************************/
    //显示网格  用切换按钮 toggle
    showGridAction = new QAction(tr("&Show Grid"),this);
    showGridAction->setCheckable(true);
    //showGridAction->setChecked(spreadsheet->showGrid());
    showGridAction->setStatusTip(tr("Show or hide the spreadsheet's grid"));
    //connect(showGridAction, SIGNAL(toggled(bool)),this, SLOT(setShowGrid(bool)));

    autoRecalcAction = new QAction(tr("&Auto-Recalculate"), this);
    autoRecalcAction->setCheckable(true);
    //autoRecalcAction->setChecked(spreadsheet->autoRecalculate());
    autoRecalcAction->setStatusTip(tr("Switch auto-recalculation on or "
                                      "off"));
    //connect(autoRecalcAction, SIGNAL(toggled(bool)),
    //        spreadsheet, SLOT(setAutoRecalculate(bool)));

    aboutAction = new QAction(tr("&About"), this);
    aboutAction->setStatusTip(tr("Show the application's About box"));
    //connect(aboutAction, SIGNAL(triggered()), this, SLOT(about()));

    aboutQtAction = new QAction(tr("About &Qt"), this);
    aboutQtAction->setStatusTip(tr("Show the Qt library's About box"));
    //connect(aboutQtAction, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
}


void MainWindow::createMenus()
{
    //文件菜单
    fileMenu = menuBar()->addMenu(tr("&File"));
    fileMenu->addAction(newAction);
    fileMenu->addAction(openAction);
    fileMenu->addAction(saveAction);
    fileMenu->addAction(saveAsAction);
    separatorAction = fileMenu->addSeparator(); //插入间隔器
    for(int i = 0; i < MaxRecentFiles; i++)
    {
        fileMenu->addAction(recentFileActions[i]);
    }
    fileMenu->addSeparator();
    fileMenu->addAction(exitAction);

    //编辑菜单
    editMenu = menuBar()->addMenu(tr("&Edit"));
    editMenu->addAction(cutAction);
    editMenu->addAction(copyAction);
    editMenu->addAction(pasteAction);
    editMenu->addAction(deleteAction);
    selectSubMenu = editMenu->addMenu(tr("&Select")); //edit菜单的子菜单
    selectSubMenu->addAction(selectRowAction);
    selectSubMenu->addAction(selectColumnAction);
    selectSubMenu->addAction(selectAllAction);
    editMenu->addSeparator();
    editMenu->addAction(findAction);
    editMenu->addAction(goToCellAction);

    //工具菜单
    toolsMenu = menuBar()->addMenu(tr("&Tools"));
    toolsMenu->addAction(recalculateAction);
    toolsMenu->addAction(sortAction);

    //options 菜单
    optionsMenu = menuBar()->addMenu(tr("&Options"));
    optionsMenu->addAction(showGridAction);
    optionsMenu->addAction(autoRecalcAction);


    menuBar()->addSeparator();

    //help 菜单
    helpMenu = menuBar()->addMenu(tr("&Help"));
    helpMenu->addAction(aboutAction);
    helpMenu->addAction(aboutQtAction);
}


void MainWindow::createToolBars()
{
    fileToolBar = addToolBar(tr("&File"));
    fileToolBar->addAction(newAction);
    fileToolBar->addAction(openAction);
    fileToolBar->addAction(saveAction);

    editToolBar = addToolBar(tr("&Edit"));
    editToolBar->addAction(cutAction);
    editToolBar->addAction(copyAction);
    editToolBar->addAction(pasteAction);
    editToolBar->addSeparator();
    editToolBar->addAction(findAction);
    editToolBar->addAction(goToCellAction);
}

void MainWindow::createStatusBar()
{
    locationLabel = new QLabel(" W999 ");
    locationLabel->setAlignment(Qt::AlignHCenter);
    locationLabel->setMinimumSize(locationLabel->sizeHint());

    formulaLabel = new QLabel;
    formulaLabel->setIndent(3);

    statusBar()->addWidget(locationLabel);
    statusBar()->addWidget(formulaLabel, 1);

    //connect(spreadsheet, SIGNAL(currentCellChanged(int, int, int, int)),
    //        this, SLOT(updateStatusBar()));
    //connect(spreadsheet, SIGNAL(modified()),
    //        this, SLOT(spreadsheetModified()));

    //updateStatusBar();
}

bool MainWindow::okToContinue()
{
    if (isWindowModified()) {
        int r = QMessageBox::warning(this, tr("Spreadsheet"),
                        tr("The document has been modified.\n"
                           "Do you want to save your changes?"),
                        QMessageBox::Yes | QMessageBox::No
                        | QMessageBox::Cancel);
        if (r == QMessageBox::Yes) {
            return save();
        } else if (r == QMessageBox::Cancel) {
            return false;
        }
    }
    return true;
}

void MainWindow::newFile()
{
    if (okToContinue()) {
    }
}

void MainWindow::open()
{
    if (okToContinue()) {
    }
}

bool MainWindow::save()
{
    if (curFile.isEmpty()) {
        return saveAs();
    } else {
        return saveFile(curFile);
    }
}

bool MainWindow::saveAs()
{
    return false;
}

void MainWindow::openRecentFile()
{
}

bool MainWindow::saveFile(const QString &fileName)
{
    return true;
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMessageBox>
class QAction;
class QLabel;
class FindDialog;
class Spreadsheet;

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow();

//protected:
 //   void closeEvent(QCloseEvent * event); //QWidget类中的虚函数 重新实现 可以询问是否保存
private slots:
    void newFile();
    void open();
    bool save();
    bool saveAs();
//    void find();
//    void goToCell();
//    void sort();
//    void about();
    void openRecentFile();
//    void updateStatusBar();
//    void SpreadsheetModified();


private:
    void createActions();
    void createMenus();
//   void createContextMenu();
    void createToolBars();
    void createStatusBar();
//    void readSettings();
//    void writeSettings();
    bool okToContinue();
//    bool loadFile(const QString &fileName);
    bool saveFile(const QString &fileName);
//    void setCurrentFile(const QString &fileName);
//    void updateRecentFileActions();
//    QString strippedName(const QString &fullFileName);

//    Spreadsheet *spreadsheet;
//   FindDialog *findDialog;

//    QStringList recentFiles;
    QString curFile;


    /**********菜单栏*************/
    QMenu *fileMenu;
    QMenu *editMenu;
    QMenu *selectSubMenu;
    QMenu *toolsMenu;
    QMenu *optionsMenu;
    QMenu *helpMenu;
    enum{MaxRecentFiles = 5};
    QAction *recentFileActions[MaxRecentFiles];
    QAction *separatorAction;

    /*********工具栏**********/
    QToolBar * fileToolBar;
    QToolBar * editToolBar;

    /***********状态栏*********/
    QLabel * locationLabel;
    QLabel * formulaLabel;


    //file菜单选项
    QAction * newAction;
    QAction * openAction;
    QAction * saveAction;
    QAction * saveAsAction;
    QAction * exitAction;
    //edit菜单选项
    QAction * cutAction;
    QAction * copyAction;
    QAction * pasteAction;
    QAction * deleteAction;
    QAction * selectColumnAction;
    QAction * selectRowAction;
    QAction * selectAllAction;
    QAction * findAction;
    QAction * goToCellAction;
    //tools菜单选项
    QAction * recalculateAction;
    QAction * sortAction;
    //options菜单选项
    QAction * showGridAction;
    QAction * autoRecalcAction;
    //help菜单选项
    QAction * aboutAction;
    QAction * aboutQtAction;


};

#endif // MAINWINDOW_H

main.cpp

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

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

效果如下:我偷懒,所有的图标都用同一张图。图是我用processing画的,是匡的第一个拼音K,哈哈。

 

posted @ 2014-11-04 15:37  匡子语  阅读(1161)  评论(0编辑  收藏  举报