Coś lepszego niż QKeyEvent?

0

Witam,
mam taki kod:

void MainWindow::keyPressEvent(QKeyEvent *event)
{
   if (event->key() == Qt::Key_D) {

//ruch

   }
  if (event->key() == Qt::Key_A) {

//ruch

   }

  if (event->key() == Qt::Key_S) {

//ruch

   }

  if (event->key() == Qt::Key_W) {

//ruch

   }

tam gdzie jest komentarz "ruch" jest wykonywany ruch jakiegoś obiektu w okienku i problem w tym że ten ruch nie jest płynny, na początku jakby wykonuję się, następnie robi przerwę i dopiero potem obiekt przesuwa się właściwie.
I moje pytanie brzmi : czy dało by się zrobić tak, że za pomocą klawiatury poruszać obiektem płynnie? Tak jak to np. jest w bibliotekach do gier 2d?

Z góry dziękuje za odpowiedź

0

Błąd jest zapewne w funkcji rysującej ruch tego obiektu.

0

Zrobiłem teraz tak że za każdym wciśnięciem klawisza wartość zmiennej x się powiększa o jeden a następnie wyświetla ją w label.
Gdy przytrzymuję klawisz odpowiedzialny za powyższą operacje wartość rośnie w następujący sposób:

1
//pauza na sekundę
2
3
4
...

A chciałbym żeby rosła płynnie, bez tej pauzy między jeden a dwa.

0
if(event->isAutoRepeat())
(..).

wtedy unikniesz tego przeskoku po pierwszym odczycie, jednak nastąpi ono przed pierwszym. Ja do tego wykorzystałbym QTimer'a.

edit:

#include <QLabel>
#include <QKeyEvent>
#include <QTimer>

class Widget : public QLabel {

    Q_OBJECT
    public:
        explicit Widget(QWidget *parent = 0) :
            QLabel(parent), counter(0)
        {
            setText("pusto");
            connect(&timer, SIGNAL(timeout()), this, SLOT(_slInc()));
        }

    protected:
        void keyPressEvent(QKeyEvent *ev)
        {
            if(!ev->isAutoRepeat())
                timer.start(100);
        }

        void keyReleaseEvent(QKeyEvent *ev)
        {
            if(!ev->isAutoRepeat())
            {
                timer.stop();
                counter = 0;
            }
        }

    private:
        QTimer timer;
        int  counter;

    private slots:
        void _slInc()
        {
            setText(QString::number(counter++));
        }
};

może nieeleganckie ale ma tą zaletę, że interwał możesz sobie sam ustawić :)

0

Dzięki za odpowiedź, ale niestety ten twój kod powyżej nie działa tak jak chciałem ;/
Ponieważ w nim odliczanie jest wykonywane, kiedy żadne klawisz nie jest wciśnięty, a wciśnięcie zatrzymuję akcje i zeruję licznik.

0
Pytaj napisał(a):

Ponieważ w nim odliczanie jest wykonywane, kiedy żadne klawisz nie jest wciśnięty, a wciśnięcie zatrzymuję akcje i zeruję licznik.

to dziwne, bo u mnie działa jak na leży tzn. odliczanie zaczyna się i trwa tak długo aż wciśnięty jest dowolny klawisz, a przerywa się i zeruje gdy zostaje on zwolniony.

0

Sorry, ale chyba jestem idiotą :]
Zrobiłem coś takiego:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    connect(&timer, SIGNAL(timeout()), this, SLOT(licz()));

}

MainWindow::~MainWindow()
{
    delete ui;
}




void MainWindow::keyReleaseEvent(QKeyEvent *event)
{
    if(!event->isAutoRepeat())
                   timer.start(100);
}

void MainWindow::keyPressEvent(QKeyEvent *event)
{

    if(!event->isAutoRepeat())
                {
                    timer.stop();
                    counter = 0;
                }

}


void MainWindow::licz()
{

    ui->label->setText(QString::number(counter++));
}

I efekt jest taki, jak napisałem w moim poprzednim poście, co to zrobiłem źle? Nie mogę doszukać się błedu.

0
Pyta napisał(a):

Sorry, ale chyba jestem idiotą (...)

void MainWindow::keyReleaseEvent(QKeyEvent *event)
{
    if(!event->isAutoRepeat())
                   timer.start(100);
}

void MainWindow::keyPressEvent(QKeyEvent *event)
{

    if(!event->isAutoRepeat())
                {
                    timer.stop();
                    counter = 0;
                }

}

pochrzaniłeś press z release.

0

Nie wiem jak tego nie mogłem zauważyć.

Okey, dzięki, mój problem został rozwiązany :]

1 użytkowników online, w tym zalogowanych: 0, gości: 1