宏使属性更容易

时间:2013-04-19 15:46:21

标签: c++ qt macros

我正在尝试使用宏来简化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 questionthe moc documentation之后,我认为这是因为moc不会展开#defines。有什么方法可以解决这个问题吗?

1 个答案:

答案 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.hbuild/test.cpp将是moc使用的实际代码。确保将构建添加到包含目录列表,并将build/test.cpp添加到源文件列表中。

注意:我正在研究一种在CMake中自动运行它的方法,但是我很难让moc运行在文件上。