Вообщем нужно реализовать отслеживание клавиш WASD как в играх, только в зависимости от нажатых клавиш должен формироваться массив из 4 значений принимающих 1 или 0 ,
Раскрывающийся текст
то есть зажал w получил массив 1000, зажал s получил 0100, зажал a получил 0010, зажал d получил 0001.
w+a - 1010
w+d - 1001
s+a - 0110
s+d - 0101
w+a - 1010
w+d - 1001
s+a - 0110
s+d - 0101
посоветовали использовать keypress и keyrelease
набросал такой код
Раскрывающийся текст
#include "dialog.h"
#include "ui_dialog.h"
#include<QKeyEvent>
Dialog:: Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui:: Dialog)
{
ui->setupUi(this);
}
Dialog::~Dialog()
{
delete ui;
}
int A[4];
bool key_w = false;
bool key_a = false;
bool key_s = false;
bool key_d = false;
QString Astr;
QString clear;
void Dialog::keyPressEvent(QKeyEvent *PressEvent)
{
const int firstkeyEvent = PressEvent->key();
if(firstkeyEvent == Qt::Key_W)
{
ui->UP_lb->setText("pressed");
key_w = true;
}
if(firstkeyEvent == Qt::Key_S)
{
ui->DW_lb->setText("Pressed");
key_s = true;
}
if(firstkeyEvent == Qt::Key_A)
{
ui->L_lb->setText("Pressed");
key_a = true;
}
if(firstkeyEvent == Qt::Key_D)
{
ui->R_lb->setText("Pressed");
key_d = true;
}
if(key_w == true){A[0] = 1;}
else{A[0] = 0;}
if(key_s == true){A[1] = 1;}
else{A[1] = 0;}
if(key_a == true){A[2] = 1;}
else{A[2] = 0;}
if(key_d == true){A[3] = 1;}
else{A[3] = 0;}
if(key_w == true && key_s == true){A[0] = 0;A[1] = 0;}
if(key_a == true && key_d == true){A[2] = 0;A[3] = 0;}
if(key_w == true && key_a == true && key_d){A[0] = 0;A[2] = 0;A[3] = 0;}
if(key_s == true && key_a == true && key_d){A[1] = 0;A[2] = 0;A[3] = 0;}
for(int i = 0; i < 4; i++)
{
Astr += QString::number(A[i]);
}
ui->SIG_lb->setText(Astr);
Astr = clear;
}
void Dialog::keyReleaseEvent(QKeyEvent *ReleaseEvent)
{
const int secondkeyEvent = ReleaseEvent->key();
if(secondkeyEvent == Qt::Key_W)
{
ui->UP_lb->setText("UP");
key_w = false;
}
if(secondkeyEvent == Qt::Key_S)
{
ui->DW_lb->setText("Down");
key_s = false;
}
if(secondkeyEvent == Qt::Key_D)
{
ui->R_lb->setText("Right");
key_d = false;
}
if(secondkeyEvent == Qt::Key_A)
{
ui->L_lb->setText("Left");
key_a = false;
}
if(key_w == true){A[0] = 1;}
else{A[0] = 0;}
if(key_s == true){A[1] = 1;}
else{A[1] = 0;}
if(key_a == true){A[2] = 1;}
else{A[2] = 0;}
if(key_d == true){A[3] = 1;}
else{A[3] = 0;}
if(key_w == true && key_s == true){A[0] = 0;A[1] = 0;}
if(key_a == true && key_d == true){A[2] = 0;A[3] = 0;}
if(key_w == true && key_a == true && key_d){A[0] = 0;A[2] = 0;A[3] = 0;}
if(key_s == true && key_a == true && key_d){A[1] = 0;A[2] = 0;A[3] = 0;}
for(int i = 0; i < 4; i++)
{
Astr += QString::number(A[i]);
}
ui->SIG_lb->setText(Astr);
Astr = clear;
}
И столкнулся с проблемой на форме клавиши определяются правильно и массив тоже формируется правильно, но при отправки данных в порт (если важно TCP порт) то получается при зажатии W получаю такую картину сигналов
Раскрывающийся текст
1000
0000
1000
0000
0000
1000
0000
зажал W+A получаю следующее
Раскрывающийся текст
1010
1000
1010
1000
1000
1010
1000
И дальше в таком духе!
Подскажите где ошибка!
Заранее благодарю!