Russian Qt Forum

Qt => Вопросы новичков => Тема начата: comalex1 от Февраль 28, 2012, 20:34



Название: Нажатие клавиш
Отправлено: comalex1 от Февраль 28, 2012, 20:34
Реализую движение объекта(танк в игре),таким способом:
Код C++

void MvScene::keyPressEvent(QKeyEvent * keyEvent)
{
    switch (keyEvent->key()) {
        case Qt::Key_Left:
        tank-> rotate(-90);
       .
       .
       .
       .
        case Qt::Key_Down:
 
            tank->rotate(180);
            break;
    }
 

мой танк движется но при нажатии другой кнопки останавливается,так как мне нужно реализовать ещо стрельбу ,то это непоправимо.Как мне сделать одновременное нажатие клавиш?


Название: Re: Нажатие клавиш
Отправлено: _OLEGator_ от Февраль 28, 2012, 20:49
1) в switch засовывать только взаимоисключаемые действия и вначале прочитать как работает switch
2) перейти на if


Название: Re: Нажатие клавиш
Отправлено: comalex1 от Февраль 28, 2012, 21:05
если вы имеете в виду это:
if( keyEvent->key()==Qt::Key_Left){
        tank-> rotate(-90);
        np.setX(-40);
    }
    if( keyEvent->key()==Qt::Key_Up){
     
        np.setY(-10);
    }
то так не работает ,та же проблема


Название: Re: Нажатие клавиш
Отправлено: _OLEGator_ от Февраль 28, 2012, 21:11
а, ну все верно.
Список текущих зажатых кнопок ограничен
Код
C++ (Qt)
QKeyEvent::modifiers () const

А так, если я не ошибаюсь, Qt генерирует только последнюю нажатую кнопку.
Можно посмотреть что выдает
Код
C++ (Qt)
quint32 QKeyEvent::nativeModifiers () const


Название: Re: Нажатие клавиш
Отправлено: Kurles от Февраль 28, 2012, 21:13
Обработка одновременного нажатия клавиш на клаве (http://www.prog.org.ru/topic_14857_0.html).


Название: Re: Нажатие клавиш
Отправлено: comalex1 от Февраль 28, 2012, 21:51
чесно говоря прочитав это http://www.prog.org.ru/topic_14857_0.html,я так и не понял как мне решить проблему


Название: Re: Нажатие клавиш
Отправлено: Kurles от Февраль 28, 2012, 23:33
Навскидку примерно так:

main.cpp
Код
C++ (Qt)
#include <QApplication>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
   MainWindow w;
   w.show();
 
   return a.exec();
}
 
 

mainwindow.h
Код
C++ (Qt)
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
#include <QLabel>
#include <QSet>
 
class MainWindow : public QMainWindow
{
   Q_OBJECT
public:
   explicit MainWindow(QWidget *parent = 0);
 
signals:
 
public slots:
 
protected:
   bool eventFilter(QObject *obj, QEvent *event);
   void updateKeys();
 
private:
   QLabel *label;
   bool upKey, downKey, rightKey, leftKey, fireKey;
 
};
 
#endif // MAINWINDOW_H
 
 

mainwindow.cpp
Код
C++ (Qt)
#include "mainwindow.h"
#include <QEvent>
#include <QKeyEvent>
 
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent)
{
   label = new QLabel(this);
   installEventFilter(this);
   setCentralWidget(label);
   upKey = downKey = rightKey = leftKey = fireKey = false;
}
 
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
   if (event->type() == QEvent::KeyPress || event->type() == QEvent::KeyRelease)
   {
       QKeyEvent* ke = static_cast<QKeyEvent*>(event);
       bool b;
       event->type() == QEvent::KeyPress ? b = true : b = false;
       switch(ke->key())
       {
       case Qt::Key_Up:
           upKey = b;
           break;
       case Qt::Key_Down:
           downKey = b;
           break;
       case Qt::Key_Right:
           rightKey = b;
           break;
       case Qt::Key_Left:
           leftKey = b;
           break;
       case Qt::Key_Space:
           fireKey = b;
           break;
       }
       updateKeys();
       return true;
   }
 
   return QObject::eventFilter(obj, event);
}
 
void MainWindow::updateKeys()
{
   QString text;
   if (upKey) text.append("Up ");
   if (downKey) text.append("Down ");
   if (rightKey) text.append("Right ");
   if (leftKey) text.append("Left ");
   if (fireKey) text.append("Fire ");
   label->setText(text);
}
 
 


Название: Re: Нажатие клавиш
Отправлено: comalex1 от Февраль 29, 2012, 14:51
Огромное спасиба,за ваш труд!!!!!Но вы бы не могли объяснить как работает даная программа,в часности не пойму даный код
Код:
event->type() == QEvent::KeyPress ? b = true : b = false;
Потому что теперь мой танк может стрелять и ехать одновременно только когда обе клавиши нажаты,тоесть если я просто нажму и сразу отпущю кнопку ,предположим огня,то он остановится,если одновремменно удерживать кнопку огня и движения то все работает(только почемуто он ускоряется )?
 


Название: Re: Нажатие клавиш
Отправлено: Kurles от Февраль 29, 2012, 15:20
Огромное спасиба,за ваш труд!!!!!Но вы бы не могли объяснить как работает даная программа,в часности не пойму даный код
Код:
event->type() == QEvent::KeyPress ? b = true : b = false;
Потому что теперь мой танк может стрелять и ехать одновременно только когда обе клавиши нажаты,тоесть если я просто нажму и сразу отпущю кнопку ,предположим огня,то он остановится,если одновремменно удерживать кнопку огня и движения то все работает(только почемуто он ускоряется )?
Та строчка аналогична
Код
C++ (Qt)
if (event->type() == QEvent::KeyPress) b = true; else b = false;
То есть если событие QEvent::KeyPress, то разрешаем движение/стрельбу, иначе (событие QEvent::KeyRelease) запрещаем. Если тебе надо, что бы объект продолжал движение и после отпускания кнопок - просто не обрабатывай событие QEvent::KeyRelease для кнопок движения, а в обработчике QEvent::KeyPress назначай значение false всем переменным движения, кроме последнего. Плохой из меня учитель, но как мог :)


Название: Re: Нажатие клавиш
Отправлено: kambala от Февраль 29, 2012, 15:36
намного понятнее эта строчка будет выглядеть как
Код
C++ (Qt)
bool b = event->type() == QEvent::KeyPress;


Название: Re: Нажатие клавиш
Отправлено: comalex1 от Февраль 29, 2012, 23:34
Спасибо всем за ответы ,буду розбиратся