从 QGraphicsView 向前按键
Posted
技术标签:
【中文标题】从 QGraphicsView 向前按键【英文标题】:Forward Key Press from QGraphicsView 【发布时间】:2012-12-05 15:19:30 【问题描述】:我正在尝试将 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
【问题讨论】:
【参考方案1】: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
传递给角色以管理其自己的按键,但如果您不这样做,您可能会发现很难确保场景中的不同项目不依赖相同的按键'不要将所有按键处理代码保存在一个地方。
【讨论】:
您好,我正在尝试这个,但它似乎不起作用。我的 character_controller 继承了我的 base_controller,我尝试在两者上实现它但无济于事。一旦我可以将它合并到这里,我就可以发出我的角色类的信号 @JonMorehouse 你的base_controller
继承自QGraphicsView
,对吧?
是的,我认为问题正在出现,因为我需要通过我的视图过滤事件。 IE:从基础视图到其他继承的视图,因为这些可以改变......
首先要检查的是,当您将焦点放在图形视图上然后按键盘上的某个键时,甚至会调用 keyPressEvent 处理程序。你可以通过从处理程序中打印一些东西来做到这一点。
当我将此视图连接到窗口的 main.cpp 实例时,一切正常。顶层窗口总是会拦截事件。【参考方案2】:
你必须重写 keyPressEvent 事件来捕获按键事件
【讨论】:
以上是关于从 QGraphicsView 向前按键的主要内容,如果未能解决你的问题,请参考以下文章
重写的 QGraphicsView keyPressEvent 从焦点 QGraphicsWidgets 窃取事件
从 QGraphicsScene/QgraphicsItemGroup/QGraphicsView 中正确删除项目