2013-08-04 33 views
1

我在Qt中做了一個信號插槽,程序運行沒有錯誤或關於我連接的警告。問題是,當我想使用信號插槽時,它總是返回NULL。信號/插槽與返回值不起作用

Main.cpp的

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 


    Game* game = new Game; 

    Scrabble mainWindow; 
    mainWindow.show(); 

    QObject::connect(&mainWindow,SIGNAL(getTurn()),game,SLOT(giveTurn())); 

    return a.exec(); 
} 

Game.h

class Game: public QObject 
{ 
    Q_OBJECT 
public: 
    Game(QObject *parent = 0); 
    ~Game(); 
private: 
    int m_turn; 
public slots: 
    int giveTurn(); 

}; 

Game.cpp

Game::Game(QObject *parent) 
    :QObject(parent) 
{ 
    m_turn = 1; 
} 
Game::~Game() 
{ 

} 

int Game::giveTurn() 
{ 
    return m_turn; 
} 

Scrabble.h

class Scrabble : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit Scrabble(QWidget *parent = 0); 
    ~Scrabble(); 

private: 
    Ui::Scrabble *ui; 
signals: 
    int getTurn(); 

}; 

當我在Scrabble.cpp中使用int turn = emit getTurn();時,turn將變爲0而不是1. 有沒有人知道我在做什麼錯?

+2

使用這樣的信號是非常不尋常的,甚至沒有記錄工作(http://stackoverflow.com/questions/11890644/qt-return-value-of-signal-works-why-is-the-例如官方文件 - 說它是不可能的)。如果你需要一個返回值,一個信號不是你應該使用的,你應該調用一個普通函數。 – Mat

+0

您應該將其重命名爲「Signal/Slot with return value does not work」。另請參閱此討論:http://stackoverflow.com/questions/5842124/can-qt-signals-return-a-value正如馬特所說,雖然它*可能*工作,Qt的信號/插槽不打算用於像這和你應該尋找另一種解決方案。你使用哪個Qt版本? –

+0

我使用Qt 5.0.2,我使用信號/插槽來連接模型和視圖。 – breght

回答

0

您正在使用錯誤的信號和插槽。信號無法返回值。請參閱Signals & Slots文檔頁面:

信號由moc自動生成,不得在.cpp文件中實現。他們永遠不會有返回類型(即使用void)。

正確使用Qt功能時,不需要從信號中返回值。也許你應該創建另一個問題,描述你想要做什麼以及爲什麼你需要這樣的連接。你肯定做錯了什麼。

0

信號/插槽不能返回任何值。可能的解決方法:

拼字:

signal: void requestTurn(); 
public slot: receiveTurn(int); 

遊戲:

public slot: onrequestTurn(); 
signal: sendTurn(int); 
0

emit 「關鍵詞」 的相關資料很少,現在,但是從Qt的來源,它只是空的定義,因此您的代碼

int turn = emit getTurn(); 

將擴展爲:

int turn = getTurn(); 

但是,這不包括在官方文件中,它可能隨時改變 - 所以不要使用它!

現在,請注意,turn變量沒有從插槽中獲得價值,而是從信號。沒有什麼關於將時隙的返回值傳遞給信號 - 它沒有任何意義(呃,它可能在你的示例中是有意義的,但是如果我將多個時隙連接到單個信號 - 什麼時候會返回值,如果插槽是異步執行的 - 我們是否應該等待返回值等)。

您可以使用常規函數調用(只需撥打giveTurn()函數:int turn = giveTurn())。