从QGraphicsView转发按键

时间:2012-12-05 15:19:30

标签: c++ qt signals qwidget slot

我正在尝试将我的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:实现中没有这样的信号游戏:: Character_controller :: keyPress(QKeyEvent *)/ game_controllers / character_controller.cpp:21

2 个答案:

答案 0 :(得分: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传递给角色来管理自己的按键操作,但您可能会发现很难确保场景中的不同项目不依赖于相同的键(如果您)不要将所有按键处理代码保存在一个地方。

答案 1 :(得分:3)

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