如何记录与Q_PROPERTY同名的访问者功能?

时间:2018-03-09 11:15:25

标签: c++ qt doxygen

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(属性)文档中结束。

这是一个错误,还是我错过了什么?

2 个答案:

答案 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