200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 使用类前置声明的好处-结合Qt 4一个主窗口实例讲解

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

时间:2020-06-01 16:11:36

相关推荐

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。