子类化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需要文件名的大多数地方使用它们。