2

如何将Q_PROPERTY宏放入另一个辅助宏中?

#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(感谢 ??)。

4

2 回答 2

2

Qt4.x 中的 moc 不能识别预处理器宏中的 Q_ 宏。

Qt5.x 中的 moc 在解析 Q_ 宏之前扩展了预处理器宏。

于 2014-03-04T06:49:50.447 回答
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)
于 2013-07-15T06:42:08.803 回答