Прямое нажатие клавиши из QGraphicsView

Я пытаюсь перенаправить все события нажатия клавиш из моего 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: нет такого сигнала game :: Character_controller :: keyPress (QKeyEvent *) в реализации / game_controllers / character_controller.cpp: 21


person JonMorehouse    schedule 05.12.2012    source источник


Ответы (2)


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 персонажу для управления его собственными нажатиями клавиш, но вам может быть сложно гарантировать, что разные элементы в вашей сцене не полагаются на один и тот же ключ (и), если вы не сохраните все свои ключи код обращения с прессой в одном месте.

person RA.    schedule 05.12.2012
comment
Здравствуйте, я пытаюсь это сделать, но похоже, что это не работает. Мой character_controller наследует мой base_controller, и я попытался реализовать его на обоих, но безрезультатно. Как только я смогу включить его здесь, я могу сигнализировать своему классу персонажа - person JonMorehouse; 06.12.2012
comment
@JonMorehouse Твой base_controller наследуется от QGraphicsView, верно? - person RA.; 06.12.2012
comment
да, я думаю, что проблема возникает из-за того, что мне нужно фильтровать события через мои представления. IE: из базового представления в другие унаследованные представления, поскольку они могут измениться ... - person JonMorehouse; 06.12.2012
comment
Первое, что нужно проверить, это то, что обработчик keyPressEvent вызывается даже тогда, когда вы переводите фокус на графическое представление, а затем нажимаете клавишу на клавиатуре. Вы можете сделать это, просто распечатав что-нибудь из обработчика. - person RA.; 06.12.2012
comment
Все отлично работало, когда я подключил это представление к экземпляру окна main.cpp. Окно верхнего уровня всегда будет перехватывать события. - person JonMorehouse; 07.12.2012

Вы должны переопределить событие keyPressEvent для захвата событий нажатия клавиш

person James Plusplus    schedule 05.12.2012