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

Qt4_子类化QMainWindow相关推荐

  1. Qt4_子类化QTableWidgetItem

    子类化QTableWidgetItem Cell类这个类用作保存单元格的公式,并且它还重新实现了QTableWidgetem: :data()函数,Spreadsheet可以通过QTableWid-g ...

  2. Qt4_子类化QTableWidget

    子类化QTableWidget 类Spreadsheet派生自QTableWidget,如图所示.QTableWidget是一组格子,可以非常有效地用来表达二维稀疏数组.它可以在规定的维数内显示用户滚 ...

  3. 关于如何换肤、子类化的解决方案

    对于应用程序的换肤及子类化.下面是我尝试过一些方法,以在CAboutDlg中子类化其中的Button为例: 第一种:直接用现成的类 1.自己写一个类class CButtonXP : public C ...

  4. 实现不可变类如何禁止子类化?

    实现不可变类时要求禁止子类化.本文先讲禁止子类化的方式,最后解释为什么要禁止子类化. 如何禁止子类化 常用姿势 最简单的手段是将类声明为final,如String.Integer等常用的值类.但这样缺 ...

  5. 窗口子类化-实例应用

    所谓窗口子类化:改变一个已经存在的窗口实例的性质:消息处理与其他实例属性.   通常在SDK中所谓的窗口子类化就是改变一个窗口函数(如GetWindowLong()和SetWindowLong())通 ...

  6. 动态子类化CComboBox以得到子控件EDIT及LISTBOX

    动态子类化CComboBox以得到子控件EDIT及LISTBOX Joise.LI写于2004-4-6 ComboBox是比较常用的一个控件,有三种样式:CBS_SIMPLE(简单),CBS_DROP ...

  7. Windows C/C++编程窗口子类化学习

    也许你需要一个特殊的Edit来限制浮点数的输入,但是现有的Edit却并不能完成这项工作,因为它只能够单纯的限制大小写或者纯数字.当你在论坛上求救的时候,某个网友告诉你:"用子类化." ...

  8. Wilcox:子类化顶级窗口

    Wilcox:子类化顶级窗口 Wilcox:子类化顶级窗口 编码 说明 OurFrame() vs OurFrame(wxWindow* parent, ...) 管理控件 ID Wilcox:子类化 ...

  9. wxWidgets:子类化Subclassing WxControl

    wxWidgets:子类化Subclassing WxControl wxWidgets:子类化Subclassing WxControl wxWidgets:子类化Subclassing WxCon ...

最新文章

  1. 安装 centos 7.x 自定义分区
  2. 赠书:一本书带你吃透Nginx应用与运维
  3. Lucene默认的打分算法——ES默认
  4. Activity调用栈的分析
  5. Spring boot配置文件值注入
  6. stagefright omx小结
  7. 滴滴行程单用的什么字体_打车就送冰淇淋!滴滴出行放大招,限时19天
  8. 【Python Flask】使用Ajax从后台请求数据
  9. Java multithread 多线程issue
  10. 李洋疯狂C语言之编程实现统计某年某月份的天数
  11. java字符串拼接_Java 8中字符串拼接新姿势:StringJoiner
  12. WIN10 64位 JDK的安装
  13. ftp服务器端的编写 c语言6,linux下c语言编写的ftp服务器
  14. Windows Mobile开发的一些小技巧(持续更新)
  15. 神州数码DCWS学习日志
  16. 【开源】C#跨平台物联网通讯框架ServerSuperIO(SSIO)
  17. Java 中 final 内存语义
  18. 人工智能数据集文本处理Onehot/TF/TFIDF矩阵的生成
  19. 日常开发中,String类中常用的方法
  20. 东财《组织行为学B》综合作业

热门文章

  1. 服务器系统和数据库,服务器系统和数据库
  2. python排序算法实现_排序算法整理(Python实现)
  3. MySQL服务器地址为空,C++/MySQL - 通过主机地址访问数据库时'未知的MySQL服务器主机';没有IP...
  4. java zip追加_基于Java向zip压缩包追加文件
  5. 前端性能优化(一)-- 文件的压缩与合并
  6. 【R】函数-数学函数
  7. 卸载驱动出现:rmmod: can't change directory to '/lib/modules': No such file or directory
  8. MySQL实习训练1
  9. JTable 的使用
  10. mysql 的isnull