Я сделал сигнальный слот в 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();
};
когда я использую int turn = emit getTurn();
в Scrabble.cpp поворот станет 0, а не 1.
Кто-нибудь знает, что я делаю не так?
Вы используете сигналы и слоты неправильно. Сигналы не могут вернуть значение. Увидеть сигналы & игровые автоматы страница документации:
Сигналы автоматически генерируются 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()
).