我正在尝试使用宏来简化 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
我认为这是因为 Qt 不支持多个signals
部分,这是使用我的宏的结果。编写和使用宏来简化 Qt 属性的最佳方法是什么?