从 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 窃取事件

qt获取滚动视图位置

如何从 QGraphicsView 保存图像?

从 QGraphicsScene/QgraphicsItemGroup/QGraphicsView 中正确删除项目

如何从 QGraphicsScene/QGraphicsView 创建图像文件?

如何从 QGraphicsView 中检索选定区域?