Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Qt catch pressed key

Tags:

c++

qt

paint

i think of to write primitive snake. i have window where program paints random lines.

but i can't think up how to catch pressed key to change direction of painted line.

enter image description here

class QUpdatingPathIte : public QGraphicsPathItem
{
    void advance(int phase)
    {

        if (phase == 0)
            return;

        int x,y;
        int w,a,s,d;

        char c;
        // 
        // HOW TO    MAKE THIS HERE? (i had done early in console application)
        // but i can't do this in GUI , what should i  do?

        scanf("%c",&c);
        if (c=='w')
        { x=-20; y=0; }
        else if (c=='s')
        { x=20; y=0; }
        else if (c=='a')
        { x=0; y=-20; }
        else if(c=='d')
        { x=0; y=20; }

        QPainterPath p = path();
        p.lineTo(x, y);
        setPath(p);
    }
};

#include <QtGui/QApplication>
#include "dialog.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QGraphicsScene s;
    QGraphicsView v(&s);

    QUpdatingPathIte item;
    item.setPen(QPen(QColor("black")));
    s.addItem(&item);
    v.show();

    QTimer *timer = new QTimer(&s);
    timer->connect(timer, SIGNAL(timeout()), &s, SLOT(advance()));
    timer->start(500);

    return a.exec();
}
like image 561
Tebe Avatar asked Dec 08 '25 12:12

Tebe


2 Answers

QGraphicsView inherits from from QWidget because it inherits from QAbstractScrollArea. You should create a custom subclass of QGraphicsView and just override the function keyPressEvent(). Example:

class SnakeView : public QGraphicsView
{
protected:
    keyPressEvent(QKeyEvent *e)
    {
         // Do something

         // Otherwise pass to the graphics view
         QGraphicsView::keyPressEvent(e)
    }
};

Then rather than creating a QGraphicsView object you would create a SnakeView object.

like image 194
cdyer Avatar answered Dec 10 '25 01:12

cdyer


QGraphicsView reimplements keyPressEvent and will forward events to the QGraphicsScene. QGraphicsScene supports key presses through its keyPressEvent handler. By default the QGraphicsScene will forward that key press to the current QGraphicsItem through its keyPressEvent function.

Given the above, what you likely want to do is reimplement the keyPressEvent handler in your QUpdatingPathItem:

void QUpdatingPathItem::keyPressEvent(QKeyEvent *event)
{
    switch (event->key()) {
        case Key::Key_A: /* do something useful */; break;
        case Key::Key_S: /* do something useful */; break;
        case Key::Key_W: /* do something useful */; break;
        case Key::Key_D: /* do something useful */; break;
    }
}

I couldn't really follow what you were trying to do in your advance method, so I can't offer much in the way of a suggested handler.

Besides implementing QObject::installEventFilter, you could also subclass any of QGraphicsView, QGraphicsScene, or QGraphicsItem and override the keyPressEvent function.

like image 36
Kaleb Pederson Avatar answered Dec 10 '25 02:12

Kaleb Pederson



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!