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: No such signal game::Character_controller::keyPress(QKeyEvent *) in implementation/game_controllers/character_controller.cpp:21

4

2 に答える 2

3

キー押下イベントをキャプチャするには、keyPressEvent イベントをオーバーライドする必要があります

于 2012-12-05T20:20:11.013 に答える
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 か所で処理します。

于 2012-12-05T17:25:16.580 に答える