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