StupidBeauty
Read times:3873Posted at:Tue Aug 22 00:13:05 2017 - no title specified

Q_QDOC/Qt里那些仅存在于代码中而不存在于文档中的定义

内容目录

1 概述

2 QWebEnginePage

2.1.1 enum QWebEnginePage::Feature

3 其它地方隐藏掉的定义

1 概述

Qt项目在使用Doxygen生成开发文档的过程中,会使用Q_QDOC宏来对生成的文档进行微调,使得,妳在Qt文档中看到的各个标识定义并不与实际代码完全相同。

2 QWebEnginePage

Qt 5.7.1中,QWebEnginePage类中有一个枚举,叫做 enum QWebEnginePage:: Feature

在文档中,这个枚举有5个值:

2.0.1 enum QWebEnginePage::Feature

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就会发射对应的信号向妳的代码告知这一点,这个过程中就会用到这个值。

3 其它地方隐藏掉的定义

在Qt 5.7.1中,除了QWebEnginePage以外,还有一些地方也使用Q_QDOC隐藏掉了一些定义。见下表,后面两列附上本座认为的用途和隐藏原因。

文件

行号

定义内容

用途

隐藏原因

qvideoframe.h

106

NPixelFormats,

在Qt内部代码中用于指明支持的视频格式的具体数目。有个数组,qConvertFuncs,其元素个数即为NPixelFormats,与视频格式数目相等。

这个枚举值只是起到计数作用,其意义不符合这个枚举的定义“视频数据格式”。

https://goo.gl/AW6d5b

qqml.h

503

namespace QtQml {

QtQml模块的命名空间。

为了绕过文档生成工具的一个问题。

https://goo.gl/ffvnaC

qwebenginepage.h

159

Notifications = 0,

用于表示网页请求获取权限以弹出通知。

在当时,这个特性尚未实现。

https://goo.gl/5zqGwV

qwebengineurlschemehandler.h

65

Q_SIGNALS:

    void _q_destroyedUrlSchemeHandler(QWebEngineUrlSchemeHandler*);

内部使用,用于在对象销毁时做些善后工作。

内部使用,不向外暴露。

https://goo.gl/2KxuC5

qaccessible.h

272

PushButton     = Button, // deprecated

表示对应的对象是一个按钮。

已经废弃

https://goo.gl/W8FRKj

qbytearraylist.h

67

protected:

    ~QListSpecialMethods() {}

QByteArrayList的真正析构函数

隐藏看起来怪异的析构函数。

https://goo.gl/FVXAZ 1

qcoreapplication.h

93

, int = ApplicationFlags

内部使用的参数。

隐藏内部使用的参数。

https://goo.gl/pmd18F

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的迭代器提供->操作符。

隐藏内部使用的指针类。

https://goo.gl/FG5jgb

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 opinions
Your name:Email:Website url:Opinion content: