另一个宏内的Q_PROPERTY宏

时间:2013-07-12 15:50:38

标签: c++ qt properties macros c-preprocessor

如何将Q_PROPERTY宏放在另一个helper-macro中?

#define SimpleAllinOne(member, _type) \
  public: \
  void Set##member(_type _arg_##member) \
  { \
    m_##member = _arg_##member;\
  } \
  _type Get##member() const\
  { \
    return m_##member;\
  } \
  private: \
    _type m_##member; \
    Q_PROPERTY(_type member READ Get##member WRITE Set##member)

..不起作用。预处理器输出(gcc -E flagnmake/jom /P flag)显示(工作)setter / getter方法和相应的成员变量,但不显示Q_PROPERTY行的单个字符。

更新:它似乎与Qt5.1一起使用,可以正确扩展用户宏。 Qt4.8不起作用,Qt5.0尚未经过测试。见#QTBUG-35(感谢??)。

2 个答案:

答案 0 :(得分:2)

Qt4.x中的

moc无法识别预处理器宏中的Q_宏。

Qt5.x中的

moc在解析Q_宏之前扩展了预处理器宏。

答案 1 :(得分:0)

你的行中也有一个错误

Set##member##(_type _arg_##member) \
_type Get##member##() const\

因为##()被评估为

SetArg(
_type GetArg(

由gcc拒绝(MSVC忽略它)。

尝试以下更正版本,它应该有效:

#define MachAlles(member, _type) \
  public: \
  /**
   * Set member of type _type.
   * @see m_##member for a more detailed description
   */ \
  void Set##member(_type _arg_##member) \
  { \
    m_##member = _arg_##member;\
  } \
  /**
   * Get member of type _type.
   * @see m_##member for a more detailed description
   */ \
  _type Get##member() const\
  { \
    return m_##member;\
  } \
  private: \
    _type m_##member; \
  Q_PROPERTY(_type member READ Get##member WRITE Set##member)