0

我正在尝试使用宏来简化 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 属性的最佳方法是什么?

编辑: 看了这个问题moc 文档后,我认为这是因为 moc 没有扩展#defines。有没有办法解决这个问题?

4

1 回答 1

0

我想出了一个简单的Python 脚本,它将实现您遗漏的任何内容,包括内部变量、getter、setter 和通知信号。关于它如何工作而不是我的原始宏的一个很酷的事情是,如果我想自定义其中一种方法的工作方式,我不需要多个宏。我需要做的就是在类中定义方法,脚本不会生成它。

要使用该脚本,请在类中包含一个名为的特殊标头<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 在文件上运行。

于 2013-04-20T22:16:26.450 回答