Qt 關於QT_BEGIN_NAMESPACE宏的作用


最近注意到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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM