Qt4_子类化QMainWindow

子类化QMainWindow

通过子类化QMainWindow,可以创建一个应用程序的主窗口。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

class QAction;
class QLabel;
class FindDialog;
class Spreadsheet;

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow();
    ~MainWindow();

protected:
    void closeEvent(QCloseEvent *event);

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:
    Ui::MainWindow *ui;
    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;
    QLabel *locationLabel;
    QLabel *formulaLabel;
    QStringList recentFiles;
    QString curFile;

    enum { MaxRecentFiles = 5 };
    QAction *recentFileActions[MaxRecentFiles];
    QAction *separatorAction;

    QMenu *fileMenu;
    QMenu *editMenu;
    QMenu *selectSubMenu;
    QMenu *toolsMenu;
    QMenu *optionsMenu;
    QMenu *helpMenu;
    QToolBar *fileToolBar;
    QToolBar *editToolBar;
    QAction *newAction;
    QAction *openAction;
    QAction *saveAction;
    QAction *saveAsAction;
    QAction *exitAction;
    QAction *cutAction;
    QAction *copyAction;
    QAction *pasteAction;
    QAction *deleteAction;
    QAction *selectRowAction;
    QAction *selectColumnAction;
    QAction *selectAllAction;
    QAction *findAction;
    QAction *goToCellAction;
    QAction *recalculateAction;
    QAction *sortAction;
    QAction *showGridAction;
    QAction *autoRecalcAction;
    QAction *aboutAction;
    QAction *aboutQtAction;
};

#endif // MAINWINDOW_H

void closeEvent(QCloseEvent *event);
QWidget 类中的一个虚函数,当用户关闭窗口时,这个函数会被自动调用。
类MainWindow 中重新实现了它,这样就可以向用户询问一个标准问题"Do you want to save your changes?" ,并且可以把用户的一些偏好设置保存到磁盘中。

private slots:
像File→ New 和Help->About这样的菜单项,在MainWindow中会被实现为私有槽。除了save()槽和saveAs()槽返回一个bool值以外,绝大多数的槽都把void 作为它们的返回值。当槽作为一个信号的响应函数而被执行时,就会忽略这个返回值;但是当把槽作为函数来调用时,其返回值对我们的作用就和调用任何一个普通的C++ 函数时的作用是相同的。

MainWindow.cpp

#include <QtWidgets>//包含了在子类中所要用到的所有Qt类的定义

#include "mainwindow.h"
#include "ui_mainwindow.h"
//后面实现的四个类
#include "finddialog.h"
#include "gotocelldialog.h"
#include "sortdialog.h"
#include "spreadsheet.h"

MainWindow::MainWindow():ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    spreadsheet = new Spreadsheet;
    setCentralWidget(spreadsheet);
   
    createActions();
    createMenus();
    createContextMenu();
    createToolBars();
    createStatusBar();
   
    readSettings();
    //读取这个应用程序存储的一些设置

    findDialog = 0;
    //我们把findDialog指针初始化为空(null)指针。在第一次调用MainWindow::find()函数时,将会创建该FindDialog对象。

    setWindowIcon(QIcon(":/images/icon.png"));
    //把窗口图标设置为icon.png
    //资源机制
    setCurrentFile("");
    //初始化设置当前路径为空
}

在这个构造函数中,先从创建一个Spreadsheet窗口部件并且把它设置为这个主窗口的中央窗口部件开始。中央窗口部件会占用主窗口的中央区域部分Spreadsheet类是QTableWidget 类的一个子类,并且也具有一些电子制表软件的功能,如对电子制表软件公式的支持等。

私有函数createActions()、createMenus()、createContextMenu()、createToolBars()和createStatusBar( )创建主窗口中的其余部分,readSettings()则读取这个应用程序存储的一些设置。
在这里插入图片描述
我们把findDialog指针初始化为空(null) 指针。在第一次调用MainWindow: : find()函数时,将会创建该FindDialog对象。

在构造函数的最后部分,把窗口的图标设置为icon.png,它是一个PNG 格式的文件。Qt 支持很多图像格式,包括BMP 、GIF 、JPEG 、PNG 、PNM 、SVG 、TIFF、XBM 和XPM 。调用QWidget: : setWindowIcon()函数可以设置显示在窗口左上角的图标。遗憾的是,还没有一种与平台无关的可在桌面上显示应用程序图标的设置方法。

图形用户界面(GUI)应用程序通常会使用很多图片。为应用程序提供图片的方法有多种,如下是一些最常用的方法:
● 把图片保存到文件中,并且在运行时载人它们。
● 把XPM文件包含在源代码中。(这一方法之所以可行,是因为XPM文件也是有效的C++文件。)
● 使用Qt的资源机制( resource mechanism)。

这里,使用了Qt的资源机制法,因为它比运行时载入文件的方法更方便,并且该方法适用于所支持的任意文件格式。我们将选中的图片存放在源代码树中名为images 的子目录下。(右键.pro文件->在Explorer中显示->创建images文件夹->将图片放至此文件夹下)

为了利用Qt的资源系统(resource system) ,必须创建一个资源文件(resource file) 。

1、右键项目名->Qt中选择Qt Resource File->名称为“spreadsheet.qrc”

2、添加->添加前缀->前缀设置为“/”

3、添加->添加文件->打开images文件夹选中其中的图片
在这里插入图片描述
4、已经将资源文件命名为spreadsheet.qrc,因此只需在.pro 文件中添加如下一行代码:

RESOURCES += \
    spreadsheet.qrc

资源文件自身使用了一种简单的XML文件格式。这里给出的是从已经使用的资源文件中的内容。

<RCC>
    <qresource prefix="/">
        <file>images/copy.png</file>
        <file>images/cut.png</file>
        <file>images/find.png</file>
        <file>images/gotocell.png</file>
        <file>images/icon.png</file>
        <file>images/new.png</file>
        <file>images/open.png</file>
        <file>images/paste.png</file>
        <file>images/save.png</file>
    </qresource>
</RCC>

所有资源文件都会被编译到应用程序的可执行文件中,因此并不会弄丢它们。当引用这些资源时,需要使用带路径前缀:/(冒号斜线)的形式,这就是为什么会将图标表示成:/imges/icon. png的形式。资源可以是任意类型的文件(并非只是一些图像,还可以是音频、视频等等) ,并且可以在Qt需要文件名的大多数地方使用它们。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阳光开朗男孩

你的鼓励是我最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值