Qt示例项目中C++/QML源中的//! [n](n= 0,1,2 ......)标记是什么意思?
例如:
//! [0]
GLWidget::GLWidget(Helper *helper, QWidget *parent)
: QGLWidget(QGLFormat(QGL::SampleBuffers), parent), helper(helper)
{
elapsed = 0;
setFixedSize(840, 400);
setAutoFillBackground(false);
}
//! [0]
//! [1]
void GLWidget::animate()
{
elapsed = (elapsed + qobject_cast<QTimer*>(sender())->interval()) % 1000;
repaint();
}
//! [1]
//! [2]
void GLWidget::paintEvent(QPaintEvent *event)
{
QPainter painter;
painter.begin(this);
painter.setRenderHint(QPainter::Antialiasing);
helper->paint(&painter, event, elapsed);
painter.end();
}
//! [2]
Run Code Online (Sandbox Code Playgroud) 我在另一个模板类中有一个以下嵌套模板类:
template<typename T>
struct A
{
template<typename V>
struct B {};
};
Run Code Online (Sandbox Code Playgroud)
operator==嵌套类型的非成员的签名是B什么?以下天真的尝试不起作用:
template<typename T, typename V>
bool operator==(A<T>::B<V> left, A<T>::B<V> right);
Run Code Online (Sandbox Code Playgroud)
Clang,GCC和MSVC提供了各种不同的错误和/或提示错误,例如缺少template关键字,但我没有尝试解决它.
请注意,这显然有效:
template<typename T>
struct A
{
template<typename V>
struct B {};
template<typename V>
friend bool operator==(B<V> left, B<V> right)
{
return true;
}
};
Run Code Online (Sandbox Code Playgroud)
但是,我需要外部非成员声明的原因是使用qdoc记录它.qdoc正在使用clang来解析源代码,它要求我提供operator==我实际已经实现的声明,就像刚刚显示的那样.
从Qt 5.10升级到Qt 5.11之后,我开始遇到问题,无法使用QDoc为现有项目生成文档。
尽管源代码中存在相应的注释,但文档中缺少功能是许多问题之一。
我设法将问题缩小到包含Q_OBJECT宏,如提供的代码示例所示(请参见下文)。
Qt文档中确实提到了这一点:
如果未由
Cpp.ignoretokens或Cpp.ignoredirectives变量指定,则非标准构造(通常为宏)可能会导致错误的文档编制。
Q_OBJECT 但是不应被认为会引起问题,因为它会写得更远:
Q_OBJECT但是,该宏是一个例外:QDoc可以识别此特殊的非标准构造,因此无需使用Cpp.ignoredirectives变量进行指定。
无论如何,我都将其包含qt-cpp-defines.qdocconf在qdocconf文件中。
我也尝试过手动添加Q_OBJECT到忽略列表
Cpp.ignoredirectives += Q_OBJECT
Run Code Online (Sandbox Code Playgroud)
但结果是一样的。
我体验Windows 10和Ubuntu 17下所描述的问题在Windows 7下我无法执行qdoc.exe在所有。
qdocconf克服此问题的正确配置是什么?
为了快速重现(在实际情况下,声明和实现被拆分,并添加了适当的注释),请考虑以下设置:
oo
#include <QObject>
class Foo : public QObject
{
// Q_OBJECT // <-- uncomment this to break QDoc
public:
Foo() {}
void boo() {}
protected:
void moo() {}
};
Run Code Online (Sandbox Code Playgroud)
Foo.cpp
#include "Foo.h" …Run Code Online (Sandbox Code Playgroud)