我正在尝试使用宏来简化Qt属性,因此我不需要手动定义reader和writer方法以及通知信号:
#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属性的最佳方法是什么?
修改
在查看this question和the moc documentation之后,我认为这是因为moc不会展开#defines
。有什么方法可以解决这个问题吗?
答案 0 :(得分:0)
我提出了一个简单的Python script,它将实现你遗漏的任何内容,包括内部变量,getter,setter和notify信号。关于它是如何工作而不是我原来的宏的很酷的事情是,如果我想自定义其中一个方法的工作方式,我不需要多个宏。我需要的只是在类中定义方法,脚本不会生成它。
要使用该脚本,请在类中包含一个名为<filename>.gen
的特殊标头,如下所示:
class Test {
Q_OBJECT
Q_PROPERTY(int test READ test)
#include "test.gen"
}
然后,您需要在其上运行mkprop
:
mkprop test.h build/test.gen build/test.h
由于moc
不搜索包含路径,因此源文件需要与生成的标头位于同一目录中:
cp test.cpp build/test.cpp
build/test.h
和build/test.cpp
将是moc
使用的实际代码。确保将构建添加到包含目录列表,并将build/test.cpp
添加到源文件列表中。
注意:我正在研究一种在CMake中自动运行它的方法,但是我很难让moc运行在文件上。