C++ 从QGraphicsView向前按键
我正在尝试将所有按键事件从QGraphicsView转发到当前在场景中的小部件 我的QGraphicsView如下所示:C++ 从QGraphicsView向前按键,c++,qt,signals,qwidget,slot,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->
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::Character(游戏状态*游戏状态):基本对象(游戏状态){
}
字符::~Character(){
}
无效字符::更新(){
coutkeyPress(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
传递给角色以管理其自己的按键,但如果您不将所有按键处理代码保留在一个位置,则可能会发现很难确保场景中的不同项目不依赖于同一个键。按键(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事件以捕获按键事件您必须覆盖keyPressEvent事件以捕获按键事件您好,我正在尝试此操作,但它似乎不起作用。我的角色\u控制器继承了我的基本\u控制器,我尝试了在两者上实现它,但都没有用。一旦我能将它合并到这里,我就可以显示我的角色class@JonMorehouse您的base\u控制器
继承自QGraphicsView
,对吗?是的,我认为问题的出现是因为我需要通过我的视图筛选事件。即:从基本视图到其他继承视图视图,因为它们可以更改…首先要检查的是,当您将焦点放在图形视图上,然后按键盘上的某个键时,甚至会调用KeyPress事件处理程序。您只需从处理程序中打印一些内容即可完成此操作。当我将此视图连接到窗口的main.cpp实例化时,一切都很好。顶级窗口将始终拦截事件。您好,我正在尝试此操作,但它似乎不起作用。我的角色\u控制器继承了我的基本\u控制器,我尝试在这两个控制器上实现它,但都没有效果。一旦我可以将其合并到此处,我就可以向我的角色发送信号class@JonMorehouse您的base\u控制器
继承自QGraphicsView
,对吗?是的,我认为问题是因为我需要在我的视图中过滤事件。例如:从基本视图到其他继承视图,因为这些视图可能会更改…首先要检查的是,当您将焦点放在图形视图上,然后按下按钮时,甚至会调用keyPressEvent处理程序你的键盘。你可以通过从处理程序中打印一些东西来完成。当我将此视图连接到窗口的main.cpp实例化时,一切都很好。顶级窗口将始终截获事件。
Character::Character(Game_state * game_state) : Base_object(game_state) {
}
Character::~Character() {
}
void Character::update() {
cout << "HELLO FROM TIMER CONNECTED ITEM" << endl;
}