带有返回值的信号/插槽不起作用

Signal/Slot with return value doesn't work

本文关键字:插槽 不起作用 信号 返回值      更新时间:2023-10-16

我在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();
}

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

拼字游戏.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。有人知道我做错了什么吗?

您使用的信号和插槽不正确。信号不能返回值。参见Signals&插槽文档页面:

信号由moc自动生成,不得在.cpp文件中实现。它们永远不能有返回类型(即使用void)。

正确使用Qt功能时,不需要从信号中返回值。也许你应该提出另一个问题,描述你想做什么以及为什么你需要这样的联系。你肯定做错了什么。

信号/插槽不能返回任何值。可能的解决方案:

拼字游戏:

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

游戏:

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

emit"关键字"目前还没有文档记录,但从Qt的源代码来看,它只是空定义,因此您的代码

int turn = emit getTurn(); 

将扩展到:

int turn = getTurn(); 

然而,这不包括在官方文档中,它可能随时更改-所以-不要使用它

现在,请注意,turn变量不是从插槽获取值,而是从信号获取值。从一个插槽到另一个信号传递返回值是没有意义的(好吧,这在您的示例中可能有意义,但如果我将多个插槽连接到一个信号会怎样?哪个插槽将返回值,如果插槽异步执行会怎样?我们应该等待返回值吗,等等)

您可以使用常规函数调用(只需调用giveTurn()函数:int turn = giveTurn())。