2012-03-09 15 views
5

Estoy diseñando una clase QT4. Hasta ahora mi clase se ve así:Cómo generar setters y getters, y definir Q_PROPERTY() con el preprocesador de C++

class GIHNode : public QObject, public QGraphicsItem 
{ 

Q_OBJECT 
Q_INTERFACES(QGraphicsItem) 
[...] 
public: 
void setInteger(int); 
int getInteger(); 

[..] 
private: 
int Integer; Q_PROPERTY(int Integer READ getInteger WRITE setInteger) 
// Definition I'd like to replace 

The setters and getters are implemented like this: 
void GIHNode::setInteger(int x){Integer=x;} 
int GIHNode::getInteger(){return Integer;} 

Me gustaría definir una macro que hace todo este trabajo para mí. He intentado esto para la definición de una variable y el texto dentro Q_PROPERTY:

#define ID(x) x 
#define STR_HELPER(x,y) ID(x)y 
#define STRGET(x) STR_HELPER(get,x) 
#define STRSET(x) STR_HELPER(set,x) 
#define EXPORTEDVAR(type,varname) type varname; Q_PROPERTY(type varname READ STRGET(varname) WRITE STRSET(varname)) 

Cuando se sustituye la línea:

int Integer; Q_PROPERTY(int Integer READ getInteger WRITE setInteger) 

con

EXPORTEDVAR(int,Integer) 

la macro se pre correctamente -procesado, y se reemplaza con:

int Integer; Q_PROPERTY(int Integer READ getInteger WRITE setInteger) 

He comprobado manualmente con cpp. El código se compila, pero no puedo obtener la propiedad de una instancia de esta clase. Estoy usando el metaobjeto (de QT4 moc) de una instancia de esta clase para recuperar las propiedades, pero no puedo encontrarlo. Supongo que esto tiene algo que ver con el preprocesador, pero no sé cómo investigar esto.

Respuesta

3

El moc no expande macros con argumentos (Consulte moc Limitations), por lo que no verá sus declaraciones Q_PROPERTY.

Cuestiones relacionadas