使用類前置聲明的好處-結合Qt 4一個主窗口實例講解



原文:http://blog.csdn.net/qter_wd007/article/details/5406295


本實例實現一個基本的主窗口程序,包含一個菜單條、一個工具欄、中央可編輯窗體及狀態欄。

 

主窗口頭文件代碼如下:

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行,聲明瞭用於實現主窗口所需的各種元素,主要包括菜單項、工具條、狀態條以及各種動作等,它們是類的成員變量,通常我們被聲明爲私有的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章