1

Qt でシグナル スロットを作成したところ、作成した接続に関するエラーや警告なしでプログラムが実行されます。問題は、シグナルスロットを使用したい場合、常に NULL を返すことです。

メイン.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();
}

ゲーム.h

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

};

ゲーム.cpp

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

}

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

スクラブル.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();と、ターンが 1 ではなく 0 になります。誰かが私が間違っていることを知っていますか?

4

3 に答える 3

0

シグナル/スロットは値を返すことができません。考えられる解決策:

スクラブル:

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

ゲーム:

public slot: onrequestTurn();
signal: sendTurn(int);
于 2013-08-04T13:26:30.817 に答える
0

emit「キーワード」は現在非常に文書化されていませんが、Qt のソースからは空の定義にすぎないため、コード

int turn = emit getTurn(); 

次のように拡張されます。

int turn = getTurn(); 

ただし、これは公式ドキュメントではカバーされておらず、いつでも変更される可能性があるため、使用しないでください。

ここで、 variable はslotからではなく、signalturnから値を取得していることに注意してください。スロットからシグナルに戻り値を渡すことについては何もありません-そしてそれは意味がありません(まあ、あなたのサンプルでは意味があるかもしれませんが、複数のスロットを単一のシグナルに接続するとどうなるでしょうか-どのスロットが値を返すか、スロットは非同期で実行されます - 戻り値を待つ必要があります)。

通常の関数呼び出しを使用できます ( giveTurn()function:を呼び出すだけですint turn = giveTurn())。

于 2013-08-04T13:37:10.880 に答える