2013-07-12 5 views
2

Comment placer la macro Q_PROPERTY dans une autre macro d'aide?Macro Q_PROPERTY dans une autre 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) 

.. ne fonctionne pas. La sortie du préprocesseur (gcc -E flag ou nmake/jom /P flag) montre les méthodes setter/getter (de travail) et la variable membre correspondante, mais pas un seul caractère pour la ligne Q_PROPERTY.

Mise à jour: Il semble fonctionner avec Qt5.1 qui étend correctement les macros de l'utilisateur. Qt4.8 ne fonctionne pas, Qt5.0 n'a pas été testé. Voir #QTBUG-35 (merci à ??).

+0

Notez que 'Q_PROPERTY()' doit être étendu à rien par le préprocesseur sauf si 'Q_MOC_RUN' est défini. 'Q_PROPERTY()' n'est pas destiné à être vu par le compilateur, seulement par 'moc'. –

Répondre

1

moc dans Qt4.x ne reconnaît pas les macros Q_ dans les macros préprocesseur.

moc dans Qt5.x développe les macros du préprocesseur avant d'analyser les macros Q_.

0

Vous avez un bug aussi dans les lignes

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

à cause de ##() qui est évalué à

SetArg(
_type GetArg(

par gcc et rejetaient (MSVC l'ignore).

Essayez la version suivante corrigée et il devrait fonctionner:

#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) 
+0

Vous avez raison, merci pour la clarification. Cependant, cela n'affecte pas directement le problème Q_PROPERTY avec le compilateur de méta-objets de Qt. – braggPeaks