Как генерировать сеттеры и геттеры и определять Q_PROPERTY () с помощью препроцессора C ++ - PullRequest
5 голосов
/ 10 марта 2012

Я разрабатываю класс QT4.Пока мой класс выглядит так:

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;}

Я бы хотел определить макрос, который выполняет всю эту работу за меня.Я пробовал это для определения переменной и текста внутри 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))

Когда я заменяю строку:

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

на

EXPORTEDVAR(int,Integer)

макрос правильно предварительно обработан и заменен на:

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

Я проверил вручную с помощью cpp.Код компилируется, но я не могу получить свойство экземпляра этого класса.Я использую метаобъект (из QT4 moc) экземпляра этого класса для получения свойств, но я не могу его найти.Я полагаю, это как-то связано с препроцессором, но я не знаю, как это исследовать.

1 Ответ

3 голосов
/ 10 марта 2012

moc не расширяет макросы с помощью аргументов (см. moc Limitations ), поэтому он не видит ваши Q_PROPERTY операторы.

...