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

来源:互联网 发布:淘宝秒杀验证码看不懂 编辑:程序博客网 时间:2024/06/16 20:43

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

 

主窗口头文件代码如下:

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

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 网上买火车票密码忘了怎么办 快递没收到点了确认收货怎么办 快递没收到自动确认收货怎么办 房地产股市汇率一齐暴跌怎么办 尼日利亚落地签过期了怎么办 期货亏光了所有怎么办 期货钱亏完了该怎么办 做黄金亏损500万怎么办 炒黄金被骗35万怎么办 淘宝发货填错单号怎么办 发货单号填错了怎么办 发快递忘了单号怎么办 国际物流查不到物流怎么办 纸币上印邪教该怎么办 钥匙掉到电梯缝里怎么办 汽车电子钥匙铜线折一根怎么办 防盗门的锁不好开怎么办 同学帮刷饭卡说不用还钱了怎么办 em231电源指示灯不亮怎么办 运行广联达卡住怎么办 马桶被粪便(大便)堵了怎么办 子宫壁厚12mm怎么办 管子太多每次洗澡都是冷水怎么办 热水冷水装反了怎么办 大树被高锰酸钾灌溉了怎么办会死吗 防盗门门被锁了怎么办 门被里面反锁了怎么办 门里面被锁了怎么办 被锁在门里怎么办 门锁住了没钥匙怎么办 车被别人锁住了怎么办 汽车轱辘被锁了怎么办 小车轮胎被锁了怎么办 国防光缆无明显标识被挖断怎么办 临工210挖掘机柴油进气怎么办 汽车抛光蜡干了怎么办 洗碗铁丝球吃了怎么办 牙套铁丝吃肚子怎么办 小铁丝吃到肚子怎么办 绿色抛光膏干了怎么办 不锈钢被盐酸弄黑了怎么办