2012-11-16 64 views
3

我試圖連接一個信號和插槽使用QTimer作爲信號的發送者。不幸的是,當我編譯下面的代碼時,程序運行,但我收到一條警告:「game.cpp中沒有這樣的插槽QObject :: flip()」。Qt「沒有這樣的插槽QObject」警告

看來我的插槽沒有正確定義。使用關於QTimer的Youtube tutorial,聽起來好像我需要在遊戲類中添加「Q_OBJECT」宏(這在下面註釋)。但是,如果我取消註釋,那麼程序將無法編譯,並提供錯誤消息:「未定義的引用'遊戲vtable'」。

如何正確連接我的信號和定時器插槽?

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; 
    } 
} 

回答

5

你需要Q_OBJECT宏被認可的插槽。

編譯時錯誤是由於缺少MOC生成的單元造成的。取消註釋該行並刪除生成的Makefile以強制qmake重新生成必要的鏈接。

+0

這是一個Qt的bug - 必須手動處理makefile刪除嗎?我正在使用4.7.4。 – nairware

+1

通常你只需手動重新運行qmake,它不完全是一個錯誤,Qt構建系統沒有什麼好的方法來檢測你何時將一個'Q_OBJECT'宏添加到頭文件中。 – Chris

相關問題