本实例实现一个基本的主窗口程序,包含一个菜单条、一个工具栏、中央可编辑窗体及状态栏。

主窗口头文件代码如下:

1    #ifndef MAINWINDOW_H
2    #define MAINWINDOW_H
 
3    #include <QMainWindow>
 
4    class QAction;
5    class QMenu;
6    class QToolBar;
7    class QTextEdit;
 
8    class MainWindow : public QMainWindow
9    {
10           Q_OBJECT
 
11          public:
12                  MainWindow();
    
13                 void createMenus();
14                  void createActions();
15                  void createToolBars();
16                  void createStatusBar();
    
17           public slots:
18                  void slotNewFile();
19                  void slotOpenFile();
20                  void slotSaveFile();
21                  void slotCopy();
22                  void slotCut();
23                  void slotPaste();
24                  void slotAbout();
    
25           private:
    
26                  QTextCodec *codec;
    
27                  QMenu *menuFile;
28                  QMenu *menuEdit;
29                  QMenu *menuAbout;
 
30                  QToolBar *toolBarFile;
31                  QToolBar *toolBarEdit;
 
32                  QAction *actionOpenFile;
33                  QAction *actionNewFile;
34                  QAction *actionSaveFile;
35                  QAction *actionExit;
36                  QAction *actionCopy;
37                  QAction *actionCut;
38                  QAction *actionPaste;
39                  QAction *actionAboutQt;
40                  QTextEdit * text;
41   };
 
42   #endif // MAINWINDOW_H

第1和第2句定义头文件包含卫哨,目的是防止重复包含头文件,这两句与结尾的第42句结合在一起使用才是完整的。

第3句包含了QMainWindow的定义,它是主窗口类的基类。

第4至第7句对程序下文中可能用到的类进行前置声明(forward declaration)。它们会告诉编译器,我们用到的这些类已经存在了,并且不需要知道这些类的完整定义。我们为什么要这样做,而不是将它们的头文件包含进来呢?这主要是由于在程序下文中,我们只是简单的定义了指向这些类的对象的指针,而并没有涉及到该类的其他方面。

这样做的好处,一是避免了头文件被其他文件多次包含,尤其是在头文件中包含头文件时,容易造成重复包含和产生包含顺序问题,并且增大了文件的体积;二是提高了编译速度,因为编译器只需知道该类已经被定义了,而无需了解定义的细节。

小贴士尽量不要在头文件中包含另外的头文件

一种好的编程风格是,尽量在头文件中使用类前置声明程序下文中要用到的类,实在需要包含其它的头文件时,可以把它放在我们的类实现文件中。在下面的程序中,你将会看到这个准则的应用。

第8句声明了我们的MainWindow类是派生自QMainWindow。

第10句的Q_OBJECT宏对于所有使用了信号/槽机制的类而言是必需的,同时它要求被放置在类声明的开始处。

第12句声明了我们的主窗口类MainWindow的构造函数。

在第13至第16句中,createActions()函数用于创建程序中用到的动作(Action),createMenus()函数用于创建菜单(Menu),createToolBars()函数用于创建工具栏(ToolBar),CreateStatusBar()函数用于创建状态栏(StatusBar)。接着声明了用到的槽函数,如“新建文件”、“打开文件”等。最后声明了实现主窗口所需的各个元素,包括菜单项、工具条以及各个动作等。

第17至第24行,声明了类的槽,这里我们把它们定义为公有的,并且返回值均为void。需要注意的是,槽同样可以被当做普通函数被调用,这时它的返回值对我们而言与调用一个普通的C++函数产生的返回值并无二致。而当槽作为一个信号的响应函数而被执行时,它的返回值会被程序忽略。也就是说,不使用信号,我们也可以正常调用槽函数来完成一些事情。

第25至第40行,声明了用于实现主窗口所需的各种元素,主要包括菜单项、工具条、状态条以及各种动作等,它们是类的成员变量,通常我们被声明为私有的。

使用类前置声明的好处-结合Qt 4一个主窗口实例讲解相关推荐

  1. Qt应用程序主窗口框架

    Qt 应用程序主窗口框架 1. Qt资源系统.菜单栏和工具栏 1.1 使用资源 1.2 编写代码方式添加菜单 1.3 菜单栏 1.4 工具栏 2. 中心部件 3. Dock部件 4. 状态栏 5. 例 ...

  2. Qt应用程序主窗口之一:主窗口框架

    对于日常见到的应用程序而言,许多都是基于主窗口的,主窗口中包含了菜单栏.工具栏.状态栏和中心区域等.这一章会详细介绍主窗口的每一个部分,还会涉及资源管理.富文本处理.拖放操作和文档打印等相关内容.重点 ...

  3. c++ using 前置声明_C++ 类声明 类前置声明范例

    在编写C++程序的时候,偶尔需要用到前置声明(Forward declaration).下面的程序中,带注释的那行就是类B的前置说明.这是必须的,因为类A中用到了类B,而类B的声明出现在类A的后面.如 ...

  4. Qt创建停靠悬浮窗口实例

    Qt 创建停靠悬浮窗口 QDockWidget 1.Qt实现窗口停靠和悬浮使用类QDockWidget,它有两个重要方法用来设置停靠特性以及停靠区域, 1 dw1->setFeatures(QD ...

  5. QT设置非主窗口的背景图片和主窗口的背景图片(详细版)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.主窗口设置背景图片 二.非主窗口设置背景图片 前言 网上关于设置窗口背景图片大多数都是对于主窗口MainWindo ...

  6. QT 如何获取主窗口的指针

    有时候需要获取主窗口指针,从而通过指针来使用其方法,详见代码: QMainWindow* getMainWindow() {foreach(QWidget *w, qApp->topLevelW ...

  7. c/c++ 前置声明 -- typedef问题

    前几天写过前置声明的问题,不过今天写代码时又遇到了同样的问题,不过是一个typedef出来的问题. 前置声明的好处很多, 比如能避免头文件互相包含的冲突, 比如有时我们在一个头文件中只需要另一个头文件 ...

  8. C++中前置声明(前向声明)用法的思考

    前两天因为修改自己文章<个人对QT中的namespace Ui的理解>遇到前置声明的概念,很陌生就好奇的自己码了点代码,谁知编译报错,改来改去却百思不得其解.代码如下: #include ...

  9. C++中前置声明介绍

    前置声明是指对类.函数.模板或者结构体进行声明,仅仅是声明,不包含相关具体的定义.在很多场合我们可以用前置声明来代替#include语句. 类的前置声明只是告诉编译器这是一个类型,但无法告知类型的大小 ...

最新文章

  1. css overflow和border-radius一起用 解决圆角和滚动条一起用的问题
  2. mysql slave 能写吗_MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践
  3. java中截取字符串的方式
  4. Java ServletContext 详解
  5. cvi中c语言只保留两位小数,CVI编程常见问题与错误-2012.9
  6. leetcode - 474. 一和零
  7. MYSQL DELETE 别名
  8. MySQL中使用adddate函数产生随机日期+时间
  9. MySQL 如何利用一条语句实现类似于if-else条件语句的判断
  10. BZOJ 2555: SubString [后缀自动机 LCT]
  11. Android异步批量下载图片并缓存
  12. 括号里面一个上面一个数下面一个数符号怎么打?/ 概率论组合符号怎么打?
  13. linux下载win软件,Linux大神都知道的下载工具,其实Windows平台也能用
  14. 解决elementui中多层弹窗el-dialog遮挡现象
  15. cesium加载动图方案三:通过apng-js库实现
  16. 京东方尚未成为苹果的最大供应商,但已经享受到果链的好处
  17. android开发中对图片的处理方式汇总
  18. python高频面试题_02-27 朴素贝叶斯
  19. 网络建站都有哪些步骤?
  20. 流氓软件终结者:Windows Defender

热门文章

  1. 我认为视频内容不会取代文字内容的原因
  2. MacBook Air m1的内存
  3. C++2 dimension vector
  4. 今天突然想到一个问题:地球在转动吗,由东西向西跳与由西向东跳哪个更远...
  5. Java中的Runnable、Callable、Future、FutureTask
  6. Nginx技巧:灵活的server_name,Nginx配置一个服务器多个站点 和 一个站点多个二级域名...
  7. sqlplus: error while loading shared libraries
  8. PHP实现一个ip(如:127.0.0.1)和多个域名(虚拟主机)的绑定
  9. 宣布 Windows Azure 通过 PCI DSS 合规性验证并且 ISO 认证范围扩大,同时正式发布 Windows Azure Hyper-V 恢复管理器和其他更新功能...
  10. eclipse 3.6的VE配置 Visual Editor for eclipse3.6