最近注意到QT_BEGIN_NAMESPACE宏,具體如下:
1 #ifndef PREVIEWWINDOW_H 2 #define PREVIEWWINDOW_H
3
4 #include <QWidget>
5
6 QT_BEGIN_NAMESPACE 7 class QTextBrowser; 8 QT_END_NAMESPACE 9
10 class PreviewWindow : public QWidget 11 { 12 Q_OBJECT 13 public: 14 PreviewWindow(QWidget *parent = 0); 15 void setTexts(QString s,bool b); 16
17 protected: 18 void moveEvent ( QMoveEvent * event ); 19
20 private: 21 QTextBrowser *t; 22 }; 23 #endif
在其cpp文件中使用了QTextBrowser類,qtcreator的點的代碼提示也沒有出來(還是因為沒有包括#include<QTextWidget>)
對於QT_BEGIN_NAMESPACE宏的作用
QT_BEGIN_NAMESPACE其實就是個宏,以前Qt4是沒有命令空間的,后來才加上的,編譯Qt源碼時會有選項,是否將這些類放到專用的Qt命令空間內,默認是沒有的。這就出來問題了,為了統一,如果你的代碼在默認沒有Qt命令空間的SDK中編譯,那你就不用在前面加上命令空間,反之則需要。
為了屏蔽上面這個差異,使得你的代碼能在這兩種情況下都進行編譯,Qt就提供了QT_BEGIN_NAMESPACE宏,這樣開發者就省的自己來用程序或宏進行處理了。
至於說該宏提升編譯速度什么的,那是上述類的聲明的作用,與Qt無關的(也即與該宏QT_BEGIN_NAMESPACE無關),若要大幅提升編譯速度需要開啟qt的預編譯頭文件,會另起章節解說,並附測試結果。
常見的三種包含類的方式
1 #define PREVIEWWINDOW_H
2
3 #include <QMainWindow>
4
5 #if 0
6 // 方式一:
7 #include <QTextBrowser>
8 #endif
9
10 #if 0
11 // 方式二: 比方式一可輕微提升編譯速度
12 class QTextBrowser; 13 #endif
14
15 #if 1
16 // 方式三: 編譯速度與方式二一樣,該宏用於自編譯qt源碼是否啟動命令空間的補充
17 QT_BEGIN_NAMESPACE 18 class QTextBrowser; 19 QT_END_NAMESPACE 20
21 #endif
22
23 class PreviewWindow : public QMainWindow 24 { 25 Q_OBJECT 26 public: 27 explicit PreviewWindow(QWidget *parent = 0); 28
29 signals: 30
31 public slots: 32
33 }; 34
35 #endif // PREVIEWWINDOW_H