TL; DR:如何为与Q_PROPERTY
声明的属性同名的访问者生成doxygen文档?
Qt' property system可以在给定属性上使用Qt的元对象系统:
// example class and documentation
class Widget : public QObject {
Q_OBJECT
Q_PROPERTY(int size READ size WRITE setSize NOTIFY sizeChanged)
public:
Widget(QObject * parent = nullptr) : QObject(parent){}
int size() const;
public slots:
void setSize(int new_size);
signals:
void sizeChanged(int); //!< signals a size change
private:
int m_size = 0; //!< the Widget's size, see #size.
};
如果现在在实现中使用doxygen
//! @property size is the size of our widget
//! @brief Set the widget's size to @a new_size.
void Widget::setSize(int new_size) {
if(new_size != m_size) {
m_size = new_size;
emit sizeChanged(m_size);
}
}
//! @brief Returns the widget's size.
int Widget::size() const {
return m_size;
}
仅正确生成setSize
个文档。 size()
的文档被误认为属性的文档。上面的代码就像
//! @property size
//! @brief Returns the widget's size.
int Widget::size() const {
return m_size;
}
被使用了。 @fn Widget::size()const
或任何其他doxygen特殊命令似乎都没有帮助:size()
生成的文档保持为空并最终在size
(属性)文档中结束。
这是一个错误,还是我错过了什么?
答案 0 :(得分:6)
这是known bug或相当未实现的功能。截至今天,如果属性和吸气剂具有相同的名称,则无法记录属性和吸气剂。 getter的文档总是会出现在该属性的文档中。
这是doxygen
findmember
实施的原因。如果您使用doxygen -d findmembers
,则可以看到size
(属性)和size()
(函数)&#34;匹配&#34;:
findMemberDocumentation(): root->type=`int' root->inside=`' root->name=`Widget::size' root->args=`() const ' section=6000000 root->spec=0 root->mGrpId=-1 findMember(root=0x197efe0,funcDecl=`int Widget::size() const ',related=`',overload=0,isFunc=1 mGrpId=-1 tArgList=(nil) (#=0) spec=0 lang=200 findMember() Parse results: namespaceName=`' className=`Widget` funcType=`int' funcSpec=`' funcName=`size' funcArgs=`() const' funcTempList=`' funcDecl=`int Widget::size' related=`' exceptions=`' isRelated=0 isMemberOf=0 isFriend=0 isFunc=1 1. funcName=`size' 2. member name exists (2 members with this name) 3. member definition found, scope needed=`Widget' scope=`Widget' args=`' fileName=/tmp/test/example.cpp 4. class definition Widget found 5. matching `'`() const' className=Widget namespaceName= 6. match results of matchArguments2 = 1
您甚至可以使用其他非const
变体int size()
重现此问题。您将最终得到三个具有相同名称的成员。 Doxygen目前无法处理具有相同名称的属性和函数,在这种情况下不会记录getter。
如果您不需要该属性文档,则可以在Q_PROPERTY
中禁用Doxyfile
宏(如documented):
ENABLE_PREPROCESSING = YES
MACRO_EXPANSION = YES
PREDEFINED = Q_PROPERTY(x)=
lexer不会扫描Q_PROPERTY
。
答案 1 :(得分:0)
如承诺的那样: 与原始代码的不同之处在于文档未放在实现文件中,而是放在包含文件中。
包含文件:
// example class and documentation
class Widget : public QObject {
Q_OBJECT
//! size is the size of our widget
Q_PROPERTY(int size READ size WRITE setSize NOTIFY sizeChanged)
public:
//! Set the widget's size to @a new_size.
Widget(QObject * parent = nullptr) : QObject(parent){}
//! Returns the widget's size.
int size() const;
public slots:
void setSize(int new_size);
signals:
void sizeChanged(int); //!< signals a size change
private:
int m_size = 0; //!< the Widget's size, see #size.
};
实施档案:
void Widget::setSize(int new_size) {
if(new_size != m_size) {
m_size = new_size;
emit sizeChanged(m_size);
}
}
int Widget::size() const {
return m_size;
}
doxygen配置文件中的差异(Doxyfile
,可能有几个设置为YES):
EXTRACT_ALL = YES
EXTRACT_PRIVATE = YES
EXTRACT_PACKAGE = YES
EXTRACT_STATIC = YES
EXTRACT_LOCAL_METHODS = YES
EXTRACT_ANON_NSPACES = YES