Russian Qt Forum
Ноябрь 24, 2024, 08:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Нажатие клавиш  (Прочитано 7987 раз)
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;
    }
 

мой танк движется но при нажатии другой кнопки останавливается,так как мне нужно реализовать ещо стрельбу ,то это непоправимо.Как мне сделать одновременное нажатие клавиш?
Записан
_OLEGator_
Гость
« Ответ #1 : Февраль 28, 2012, 20:49 »

1) в switch засовывать только взаимоисключаемые действия и вначале прочитать как работает switch
2) перейти на if
Записан
comalex1
Гость
« Ответ #2 : Февраль 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);
    }
то так не работает ,та же проблема
Записан
_OLEGator_
Гость
« Ответ #3 : Февраль 28, 2012, 21:11 »

а, ну все верно.
Список текущих зажатых кнопок ограничен
Код
C++ (Qt)
QKeyEvent::modifiers () const

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

Сообщений: 480



Просмотр профиля
« Ответ #4 : Февраль 28, 2012, 21:13 »

Обработка одновременного нажатия клавиш на клаве.
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
comalex1
Гость
« Ответ #5 : Февраль 28, 2012, 21:51 »

чесно говоря прочитав это http://www.prog.org.ru/topic_14857_0.html,я так и не понял как мне решить проблему
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #6 : Февраль 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);
}
 
 
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
comalex1
Гость
« Ответ #7 : Февраль 29, 2012, 14:51 »

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

Сообщений: 480



Просмотр профиля
« Ответ #8 : Февраль 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 всем переменным движения, кроме последнего. Плохой из меня учитель, но как мог Улыбающийся
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #9 : Февраль 29, 2012, 15:36 »

намного понятнее эта строчка будет выглядеть как
Код
C++ (Qt)
bool b = event->type() == QEvent::KeyPress;
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
comalex1
Гость
« Ответ #10 : Февраль 29, 2012, 23:34 »

Спасибо всем за ответы ,буду розбиратся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.396 секунд. Запросов: 22.