0

我正在尝试将 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;


}

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

我得到的错误是这样的:

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

4

2 回答 2

3

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给角色以管理其自己的按键,但如果您不保留所有按键,您可能会发现很难确保场景中的不同项目不依赖相同的按键在一个地方处理代码。

于 2012-12-05T17:25:16.580 回答
3

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

于 2012-12-05T20:20:11.013 回答