从QGraphicsView转发按键

Forward Key Press from QGraphicsView

本文关键字:转发 QGraphicsView      更新时间:2023-10-16

我正在尝试将所有按键事件从我的QGraphicsView转发到当前在现场的小部件。

我的QGraphicsView看起来像这样:

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

然后,我的角色哪个子类QWidget,应该接收所有按键事件

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

}
Character::~Character() {


}
void Character::update() {
    cout << "HELLO FROM TIMER CONNECTED ITEM" << endl;

}

出于某种原因,这不起作用。如何将视图中的所有按键事件转发到我的角色?

我得到的错误是这样的:

对象::连接:没有

这样的信号游戏::Character_controller::keyPress(QKeyEvent *) 在实现/game_controllers/character_controller.cpp:21

>keyPress(QKeyEvent*)不作为信号存在,因此您会收到错误消息。 因此,您不能这样做:

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

为了在图形视图中捕获按键事件,您需要覆盖keyPressEvent函数:

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

您可以将QKeyEvent传递给角色来管理其自己的按键操作,但是如果您不将所有按键处理代码保存在一个位置,则可能很难确保场景中的不同项目不依赖于相同的按键。

您必须覆盖 keyPressEvent 事件才能捕获按键事件