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

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

 

主窗口头文件代码如下:

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

 

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值