Home Ask Login Register

Developers Planet

Your answer is one click away!

Jarrod A. February 2016

How to exit a "game" in Qt when health is 0

I'm quite new to Qt, but I got into it to start experimenting with making 2D games. I've got a extremely rough and simple game started, but I have an issue. Whenever the health gets to 0, the game doesn't end. I just want to know how to end the game and where to put this exit command before making a "Game Over" screen. My code is below, and from what I can grasp, I assume the QApplication::quit() goes in the Game.cpp file. Doing this by taking the health integer from Health.cpp and Health.h and putting it in Game.cpp. Any help is appreciated. Here is the code I feel the answers lie in, if more info is needed, ask.


#ifndef GAME_H
#define GAME_H

#include <QGraphicsView>
#include <QWidget>
#include <QGraphicsScene>
#include "Player.h"
#include "Score.h"
#include "Health.h"
#include "Level.h"
#include "Main.h"

class Game: public QGraphicsView{
    Game(QWidget * parent=0);

    QGraphicsScene * scene;
    Player * player;
    Score * score;
    Health * health;
    Level * level;
    Main * close;
    int end();

#endif // GAME_H


#include "Game.h" 
#include <QTimer>
#include <QGraphicsTextItem>
#include <QFont>
#include "Enemy.h"
#include <QMediaPlayer>
#include <QBrush>
#include <QImage>
#include <QApplication>

Game::Game(QWidget *parent){
    // create the scene
    scene = new QGraphicsScene();
    scene->setSceneRect(0,0,800,600); // make the scene 800x600        instead of infinity by infinity (default)

    // make the newly created scene the scene to visualize (since Game is a QGraphicsView Widget,
    // it can be used to visualize scenes)

    // create the pl        


jpo38 February 2016

Your end() function is never called.

The best way to achieve what you want to is to use Qt's signal/slot mechanism. It amkes it easy to connect an event (signal) to an action (slot):

  • Add Q_OBJECT macro to Health and Game classes and make sure your compilation environment moc's the two header files
  • Declare in Health a signal named dead()
  • Emit the signal from Health::decrease()
  • Make Game::end() be a slot and be void
  • Connect Health::dead() to Game::end()

Then, Game::end() will be called as soon as Health reaches zero.

class Health: public QGraphicsTextItem 
    Health(QGraphicsItem * parent=0);
    void decrease();
    int getHealth();
    void dead();
    int health;


class Game: public QGraphicsView{

public slots:
    void end();


void Health::decrease(){
    setPlainText(QString("Health: ") + QString::number(health));
    if ( health == 0 )
        emit dead();


Game::Game(QWidget *parent){


    connect( health, SIGNAL(dead()), this, SLOT(end()) );



void Game::end(){
    // no need to test health anymore, as signal is emited when health is zero
    // do some extra stuff before exiting

If end() only calls QApplication::quit(), you can remove it and diectly connect the signal to QApplication::quit(), like that:

connect( health, SIGNAL(dead()), qApp, SLOT(quit()) );

Also note that you were testing health == 0

phyatt February 2016

In Health::decrease emit a signal or put the logic for it in where the "player is shot" area. But to do that, you to Health or the class with the logic to be a QObject so that it gets the signals and slots in the header. EDIT QGraphicsTextItem is already a QObject. See comments.

Connect the signal to the view's close() right after the Health class or Player class is instantiated.


Hope that helps.

Post Status

Asked in February 2016
Viewed 3,089 times
Voted 5
Answered 2 times


Leave an answer

Quote of the day: live life

Devs Planet ®

2014-2016 www.devsplanet.com

Devs Planet © all rights reserved