JonMorehouse
JonMorehouse

Reputation: 1383

Forward Key Press from QGraphicsView

I'm attempting to forward all key press events from my QGraphicsView to a widget that is currently on the scene.

My QGraphicsView looks like this:

Character_controller::Character_controller(Game_state * game_state) : Game_base_controller(game_state) {

        this->character = new Character(this->game_state);

        this->scene->addWidget(this->character);

        connect(this, SIGNAL(keyPress(QKeyEvent *)), this->character, SLOT(update()));

    }

And then, my character which subclasses QWidget, which should recieve all keypress events

Character::Character(Game_state * game_state) : Base_object(game_state) {


}

Character::~Character() {





}

void Character::update() {

    cout << "HELLO FROM TIMER CONNECTED ITEM" << endl;


}

For some reason, this isn't working. How can I forward all keypress events from the view to my character?

The error I get is this:

Object::connect: No such signal game::Character_controller::keyPress(QKeyEvent *) in implementation/game_controllers/character_controller.cpp:21

Upvotes: 1

Views: 2749

Answers (2)

James Plusplus
James Plusplus

Reputation: 31

You have to override the keyPressEvent event to capture key press events

Upvotes: 3

RA.
RA.

Reputation: 7777

keyPress(QKeyEvent*) doesn't exist as a signal, hence the error message that you're getting. As such, you can't do this:

connect(this, SIGNAL(keyPress(QKeyEvent *)), this->character, SLOT(update()));

In order to capture key press events in your graphics view, you will need to override the keyPressEvent function:

void Character_controller::keyPressEvent(QKeyEvent* event)
{
   // Call functions on your character here.
   switch (event->key())
   {
   case Qt::Key_A:
       character->moveLeft(); // For example
       break;
   case Qt::Key_D:
       character->moveRight(); // For example
       break;
   ...
   }

   // Otherwise pass to QGraphicsView.
   QGraphicsView::keyPressEvent(event);
}

You could just pass the QKeyEvent to the character to manage its own key presses, but you might find it difficult to ensure that different items in your scene don't rely on the same key(s) if you don't keep all your key press handling code in one place.

Upvotes: 4

Related Questions