crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> QGraphicsView + KeyPress Event
Гость_DerKetzer_*
сообщение 6.11.2011, 22:44
Сообщение #1





Гости








    


Доброго времени суток,
Решил поделать курсач. Для этого выбрал библиотеку QT(раньше с ней дело не имел)...
Пытаюсь создать небольшую игрушку. Для этого использую QPainter + QGraphicsView + QGraphicsScene. Как рисовать я понял... Но как считывать нажатие клавиш?

Код main'a:

int main(int argc, char **argv)
{
     QApplication app(argc, argv);
     qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
     QGraphicsScene scene;
     QGraphicsView view;
     for (int i = 0; i < 8; ++i) {
     Tanks *tank= new Tanks;
     scene.addItem(tank);
     }
     view.show();
     return app.exec();
}


Если вставить функцию:

void QGraphicsView::KeyPressEvent(QKeyEvent* event){
    if(event->key()==Qt::Key_W) {
         //Do Smth
    }
}


То при нажатии на 'W' ничего не происходит.

Помогите нубасу пожалуйста! :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
wiz29
  опции профиля:
сообщение 7.11.2011, 12:08
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


обрисую в общих чертах, как сделать правильно для твоей программы.
Создай класс который будет генерить сигналы нажатия/отжатия кнопок.
Для это в конструкторе класса установи
    if (qApp)
    {
        qApp->installEventFilter(this);
    }


далее в процедуре фильтра событий обрабатывай QEvent::KeyPress и генери сигнал.
выглядеть это будет примерно следующим образом
bool AppKeyHook::eventFilter(QObject* pObj, QEvent* e)
{
    if (pObj)
    {
        if (e->type() == QEvent::KeyPress)
        {
            QKeyEvent* pKeyEv = static_cast<QKeyEvent*>(e);
            if (!pKeyEv->isAutoRepeat())
            {
                std::map<int, bool>::iterator pos = m_keyMap.find(pKeyEv->key());
                if (pos != m_keyMap.end())
                {
                    if (pos->second == false)
                    {
                        pos->second = true;
                        emit KeyPressed(pKeyEv->key());
                    }
                }
                else
                {
                    m_keyMap[pKeyEv->key()] = true;
                    emit KeyPressed(pKeyEv->key());
                }
            }
        }
        else if (e->type() == QEvent::KeyRelease)
        {
            QKeyEvent* pKeyEv = static_cast<QKeyEvent*>(e);            
            if (!pKeyEv->isAutoRepeat())
            {
                std::map<int, bool>::iterator pos = m_keyMap.find(pKeyEv->key());
                if (pos != m_keyMap.end())
                {
                    if (pos->second == true)
                    {
                        pos->second = false;
                        emit KeyReleased(pKeyEv->key());
                    }
                }
                else
                {
                    m_keyMap[pKeyEv->key()] = false;
                    emit KeyReleased(pKeyEv->key());
                }
            }
        }
    }
    return false;
}

все довольно просто
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 25.5.2022, 1:22