使用类前置声明的好处-结合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行,聲明了用于實現主窗口所需的各種元素,主要包括菜單項、工具條、狀態條以及各種動作等,它們是類的成員變量,通常我們被聲明為私有的。
總結
以上是生活随笔為你收集整理的使用类前置声明的好处-结合Qt 4一个主窗口实例讲解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STM32嘀!嘀!嘀!点触式发报机
- 下一篇: 生信分析和美图资源推荐!!!