3

信号の送信者としてQTimerを使用して信号とスロットを接続しようとしています。残念ながら、以下のコードをコンパイルすると、プログラムは実行されますが、「game.cppにそのようなスロットQObject :: flip()はありません」という警告が表示されます。

スロットが正しく定義されていないようです。QTimerに関するYoutubeチュートリアルを使用すると、ゲームクラス内に「Q_OBJECT」マクロを追加する必要があるように聞こえました(これは以下でコメント化されています)。ただし、コメントを外すと、プログラムのコンパイルに失敗し、「'vtableforGame'への未定義の参照」というエラーメッセージが表示されます。

タイマーの信号とスロットを正しく接続するにはどうすればよいですか?

game.h

#ifndef GAME_H
#define GAME_H

#include "player.h"
#include <QtCore>

class Game : public QObject {

    //Q_OBJECT

public:
    Game();
    void timed_job();

public slots:
    void flip();

private:
    bool is_game_on;
    QTimer *timer;

    Player player_1;
    Player player_2;
    Player player_3;
};

#endif // GAME_H

game.cpp

#include "game.h"
#include <QtCore>

Game::Game() {
    is_game_on = true;
}

void Game::timed_job() {
    timer = new QTimer(this);
    timer->start(1000);
    connect(timer, SIGNAL(timeout()), this, SLOT(flip()));
}

void Game::flip() {
    if(is_game_on == true) {
        is_game_on = false;
    }
    else {
        is_game_on = true;
    }
}
4

1 に答える 1

5

Q_OBJECTスロットを認識するためにはマクロが必要です。

コンパイル時エラーは、MOCで生成されたユニットが欠落していることが原因で発生します。行のコメントを解除し、生成されたMakefileを削除して、qmakeに必要なリンクを再生成させます。

于 2012-11-16T04:29:34.977 に答える