 
 
 
  
  Q_QDOC/Qt里那些仅存在于代码中而不存在于文档中的定义
Qt项目在使用Doxygen生成开发文档的过程中,会使用Q_QDOC宏来对生成的文档进行微调,使得,妳在Qt文档中看到的各个标识定义并不与实际代码完全相同。
Qt 5.7.1中,QWebEnginePage类中有一个枚举,叫做 enum QWebEnginePage:: Feature 。
在文档中,这个枚举有5个值:
This enum describes the platform feature access categories that the user may be asked to grant or deny access to:
| Constant | Value | Description | 
| QWebEnginePage::Geolocation | 1 | Location hardware or service. | 
| QWebEnginePage::MediaAudioCapture | 2 | Audio capture devices, such as microphones. | 
| QWebEnginePage::MediaVideoCapture | 3 | Video devices, such as cameras. | 
| QWebEnginePage::MediaAudioVideoCapture | 4 | Both audio and video capture devices. | 
| QWebEnginePage::MouseLock | 5 | Mouse locking, which locks the mouse pointer to the web view and is typically used in games. | 
See also featurePermissionRequested (), featurePermissionRequestCanceled (), setFeaturePermission (), and PermissionPolicy .
   
  
而在代码中呢,实际上是有6个值的:
enum Feature {
#ifndef Q_QDOC
Notifications = 0,
#endif
Geolocation = 1,
MediaAudioCapture = 2,
MediaVideoCapture,
MediaAudioVideoCapture,
MouseLock
};
可以看到,由于Q_QDOC宏的存在,使得,在生成文档时,Notifications = 0 ,并未被包含在代码中,因而文档中就看不到这个枚举值的定义了。实际上在写代码时,是可以正常引用这个枚举值的。
这个值本身有实际作用,当网页通过Notifications接口向浏览器请求权限以发出通知时,Qt WebEngine就会发射对应的信号向妳的代码告知这一点,这个过程中就会用到这个值。
在Qt 5.7.1中,除了QWebEnginePage以外,还有一些地方也使用Q_QDOC隐藏掉了一些定义。见下表,后面两列附上本座认为的用途和隐藏原因。
| 文件名 | 行号 | 定义内容 | 用途 | 隐藏原因 | 
| qvideoframe.h | 106 | NPixelFormats, | 在Qt内部代码中用于指明支持的视频格式的具体数目。有个数组,qConvertFuncs,其元素个数即为NPixelFormats,与视频格式数目相等。 | 这个枚举值只是起到计数作用,其意义不符合这个枚举的定义“视频数据格式”。 | 
| qqml.h | 503 | namespace QtQml { | QtQml模块的命名空间。 | 为了绕过文档生成工具的一个问题。 | 
| qwebenginepage.h | 159 | Notifications = 0, | 用于表示网页请求获取权限以弹出通知。 | 在当时,这个特性尚未实现。 | 
| qwebengineurlschemehandler.h | 65 | Q_SIGNALS: void _q_destroyedUrlSchemeHandler(QWebEngineUrlSchemeHandler*); | 内部使用,用于在对象销毁时做些善后工作。 | 内部使用,不向外暴露。 | 
| qaccessible.h | 272 | PushButton = Button, // deprecated | 表示对应的对象是一个按钮。 | 已经废弃。 | 
| qbytearraylist.h | 67 | protected: ~QListSpecialMethods() {} | QByteArrayList的真正析构函数。 | 隐藏看起来怪异的析构函数。 | 
| qcoreapplication.h | 93 | , int = ApplicationFlags | 内部使用的参数。 | 隐藏内部使用的参数。 | 
| qdbusargument.h | 163 | , T * = Q_NULLPTR | 使用匿名参数帮助声明模板。 | 隐藏无用的参数。 | 
| qdbusconnection.h | 103 | // Qt 4.2 had a misspelling here ExportAllSignal = ExportAllSignals, | 使用别名来兼容Qt 4.2中拼错的一个枚举值。 | 隐藏拼错了而不应当被使用的枚举值。 | 
| qdbusconnectioninterface.h | 111 | // internal signals // do not use void NameAcquired(const QString &); …… | 内部使用的信号。 | 隐藏内部使用的信号。 | 
| qdbuserror.h | 90 | // don't use this one! LastErrorType = InvalidMember | 为枚举值定义上限。 | 隐藏不应当由用户使用的上限值。 | 
| qdbusmetatype.h | 76 | T * /* dummy */ = 0 | 使用匿名参数帮助声明模板。 | 隐藏无用的参数。 | 
| qdbuspendingcall.h | 73 | // pretend that they aren't here bool isFinished() const; …… | 一些内部使用的辅助方法。 | 隐藏内部使用的方法。 | 
| qdrawutil.h | 123 | // For internal use only. namespace QDrawBorderPixmap { …… } | 内部使用的一个命名空间。 | 隐藏内部使用的命名空间。 | 
| qimage.h | 127 | NImageFormats | 对支持的格式进行计数。 | 隐藏不应当被使用的格式数目计数值。 | 
| qjsonvalue.h | 195 | // ### Qt 6: Get rid of these fake pointer classes class QJsonValuePtr { …… }; …… | 用于为QJsonArray和QJsonObject的迭代器提供->操作符。 | 隐藏内部使用的指针类。 | 
| qmetatype.h | 412 | // The code that actually gets compiled. enum Type { …… }; | 此处,在生成文档时和编译时使用两套不同的代码。因为实际编译时使用的代码如果直接拿来生成文档则不容易理解,而使用单 独的一套代码来专门用于生成代码,则特别美。 | 这砣代码只是在编译期使用,不应当出现在文档中。 | 
| qnamespace.h | 1663 | // NOTE: Generally, do not add QT_Q_ENUM if a corresponding Q_Q_FLAG exists. QT_Q_ENUM(ScrollBarPolicy) …… | 将一系列的名字集合到Qt命名空间中去。 | 绕过文档生成工具的某些问题。 | 
| qopengltexture.h | 235 | enum TextureFormatClass { …… }; | 内部使用,用于检查不同纹理格式之间的兼容性。 | 隐藏内部使用的定义。 | 
| qplugin.h | 66 | QtPluginInstanceFunction instance; QtPluginMetaDataFunction rawMetaData; | 对对象进行实例化。 | 绕过文档生成工具的某些问题。 | 
| qprinter.h | 82 | typedef PageSize PaperSize; | 使用别名来表示将要废弃的枚举类型。 | 使用两套代码帮助文档生成工具生成美丽的文档。 | 
| qqueue.h | 57 | // bring in QList::swap(int, int). We cannot say using QList<T>::swap, // because we don't want to make swap(QList&) available. inline void swap(int i, int j) { QList<T>::swap(i, j); } | 此接口,用于交换队列中的两个元素。 | 隐藏掉可能引起误解的文档。 | 
| qsharedpointer.h | 48 | # include <QtCore/qsharedpointer_impl.h> | 包含QSharedPointer的具体实现。 | 使用两套代码帮助文档生成工具生成美丽的文档。 | 
| qstringlist.h | 69 | protected: ~QListSpecialMethods() {} | QStringList的真正析构函数。 | 隐藏看起来怪异的析构函数。 | 
| qtconcurrentfilterkenerl.h | 56 | namespace QtConcurrent { …… } // namespace QtConcurrent | QtConcurrent命名空间的定义。 | 绕过文档生成工具的某些问题。 | 
| qtconcurrentfunctionwrappers.h | 53 | namespace QtConcurrent { …… } // namespace QtConcurrent. …… | QtConcurrent命名空间的定义。 | 绕过文档生成工具的某些问题。 | 
| qtconcurrentiteratekernel.h | 58 | namespace QtConcurrent { …… } // namespace QtConcurrent | QtConcurrent命名空间的定义。 | 绕过文档生成工具的某些问题。 | 
| qtconcurrentmapkernel.h | 54 | namespace QtConcurrent { …… } // namespace QtConcurrent | QtConcurrent命名空间的定义。 | 绕过文档生成工具的某些问题。 | 
| qtconcurrentmedian.h | 56 | namespace QtConcurrent { …… } // namespace QtConcurrent | QtConcurrent命名空间的定义。 | 绕过文档生成工具的某些问题。 | 
| qtconcurrentreducekernel.h | 69 | /* …… */ enum { ReduceQueueStartLimit = 20, …… }; …… | 归并队列长度上限定义。 | 绕过文档生成工具的某些问题。 | 
| qtconcurrentrunbase.h | 56 | namespace QtConcurrent { …… } // namespace QtConcurrent | QtConcurrent命名空间的定义。 | 绕过文档生成工具的某些问题。 | 
| qtconcurrentstoredfunctioncall.h | 54 | namespace QtConcurrent { …… } // namespace QtConcurrent | QtConcurrent命名空间的定义。 | 绕过文档生成工具的某些问题。 | 
| qtconcurrentthreadengine.h | 60 | namespace QtConcurrent { …… } // namespace QtConcurrent | QtConcurrent命名空间的定义。 | 绕过文档生成工具的某些问题。 | 
| qtestcase.h | 346 | QTEST_COMPARE_DECL(short) …… | 若干基本数据类型的声明。 | 绕过文档生成工具的某些问题。 | 
| qvariant.h | 364 | struct PrivateShared { …… }; …… | 内部使用,用来实现联合体功能的共享存储对象。 | 隐藏内部使用的类定义。 | 
| qwidget.h | 743 | template <> inline QWidget *qobject_cast<QWidget*>(QObject *o) { …… } …… | 将对象转换成界面部件。 | 绕过文档生成工具的某些问题。 | 
| qwindow.h | 367 | template <> inline QWindow *qobject_cast<QWindow*>(QObject *o) { …… } …… | 将对象转换成界面窗口。 | 绕过文档生成工具的某些问题。 | 
未知美人
未知美人
未知美人
未知美人
未知美人
Your opinionsHxLauncher: Launch Android applications by voice commands
