1

我在 Qt 中创建了一个信号槽,程序运行时没有错误或关于我所做的连接的警告。问题是当我想使用信号槽时,它总是返回 NULL。

主文件

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();

};

当我int turn = emit getTurn();在 Scrabble.cpp 中使用时,turn 将变为 0 而不是 1。有谁知道我做错了什么?

4

3 回答 3

0

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

int turn = emit getTurn(); 

将扩展为:

int turn = getTurn(); 

但是,官方文档中并未对此进行介绍,并且可能随时更改 - 所以 - 不要使用它!

现在,请注意turn变量不是从slot获取值,而是从signal获取值。将返回值从插槽传递到信号没有任何意义 - 这没有意义(好吧,这在您的示例中可能有意义,但是如果我将多个插槽连接到单个信号怎么办 - 什么插槽将返回值,如果插槽是异步执行的——我们是否应该等待返回值等)。

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

于 2013-08-04T13:37:10.880 回答
0

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

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

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

于 2013-08-04T13:21:25.440 回答
0

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

拼字游戏:

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

游戏:

public slot: onrequestTurn();
signal: sendTurn(int);
于 2013-08-04T13:26:30.817 回答