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

signalsこれは、私のマクロを使用した結果、Qt が複数のセクションをサポートしていないためだと思います。Qt プロパティを簡素化するためにマクロを作成して使用する最良の方法は何ですか?

編集: this questionmoc documentation を見た後、これは moc が展開されないためだと思います#defines。これを回避する方法はありますか?

4

1 に答える 1

0

内部変数、ゲッター、セッター、通知シグナルなど、省略したものをすべて実装する単純なPython スクリプトを考え出しました。元のマクロの代わりに動作する方法の優れた点は、メソッドの 1 つがどのように動作するかをカスタマイズしたい場合に、複数のマクロを必要としないことです。クラスでメソッドを定義するだけで、スクリプトはそれを生成しません。

<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 をインクルード ディレクトリのリストに追加build/test.cppし、ソース ファイルのリストに追加してください。

注: CMake でこれを自動的に実行する方法に取り組んでいますが、moc をファイルで実行するのが困難です。

于 2013-04-20T22:16:26.450 に答える