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

时间:2013-08-04 12:49:03

标签: c++ qt signals connect slot

我在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();时,转弯将变为0而不是1。 有谁知道我做错了什么?

3 个答案:

答案 0 :(得分:0)

您错误地使用了信号和插槽。信号无法返回值。请参阅Signals & Slots文档页面:

  

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

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

答案 1 :(得分:0)

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

拼字:

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

游戏:

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

答案 2 :(得分:0)

emit“关键字”现在是高度无证的,但是从Qt的来源来看,它只是空的定义,所以你的代码

int turn = emit getTurn(); 

将扩展为:

int turn = getTurn(); 

但是,这不在官方文档中,并且可能随时更改 - 所以 - 不要使用它!

现在,请注意turn变量未从广告位获取值,而是从信号获取值。没有任何关于将返回值从一个插槽传递到另一个信号 - 它没有意义(好吧,它可能在您的示例中有意义,但如果我将多个插槽连接到单个信号,那么什么插槽将返回值,如果槽是异步执行的 - 我们应该等待返回值等。)。

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

相关问题