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