マクロを使用して Qt プロパティを簡素化しようとしているので、リーダーとライターのメソッドと通知シグナルを手動で定義する必要はありません。
#define PROPERTY(type, name, reader, writer) \
public: \
Q_PROPERTY(type name READ reader WRITE writer NOTIFY name ## Changed) \
\
type reader() const { \
return m_ ## name; \
} \
\
public Q_SLOT: \
void writer(type name) { \
m_ ## name = name; \
emit name ## Changed(name); \
} \
\
private: \
type m_ ## name; \
\
Q_SIGNAL: \
void name ## Changed(type name);
次に、次のように使用します。
class Test : public QObject
{
Q_OBJECT
PROPERTY(QString, name, name, setName)
}
ただし、リンク中にエラーが発生します。
CMakeFiles/weather-desktop.dir/weather/location.o: In function `Weather::Location::setName(QString)':
/home/mspencer/Programs/weather-desktop/src/weather/location.h:37: undefined reference to `Weather::Location::nameChanged(QString)'
collect2: error: ld returned 1 exit status
make[2]: *** [src/weather-desktop] Error 1
make[1]: *** [src/CMakeFiles/weather-desktop.dir/all] Error 2
make: *** [all] Error 2
signals
これは、私のマクロを使用した結果、Qt が複数のセクションをサポートしていないためだと思います。Qt プロパティを簡素化するためにマクロを作成して使用する最良の方法は何ですか?
編集: this questionとmoc documentation
を見た後、これは moc が展開されないためだと思います#defines
。これを回避する方法はありますか?