我正在尝试将我的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
答案 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事件才能捕获按键事件