首页 文章

从QGraphicsView转发按键

提问于
浏览
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:在实现/ game_controllers / character_controller.cpp中没有这样的信号游戏:: Character_controller :: keyPress(QKeyEvent *):21

2 回答

  • 3

    keyPress(QKeyEvent*) 不会't exist as a signal, hence the error message that you'得到 . 因此,你不能这样做:

    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 传递给角色以管理自己的按键操作,但您可能会发现很难确保场景中的不同项目不会将所有按键处理代码保存在一个位置 .

  • 3

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

相关问题