Qt抓住按键

Teb*_*ebe 2 c++ qt paint

我想写原始的蛇.我有窗口程序绘制随机线.

但我想不出如何抓住按键来改变画线的方向.

在此输入图像描述

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();
}
Run Code Online (Sandbox Code Playgroud)

cdy*_*yer 9

QGraphicsView继承自QWidget,因为它继承自QAbstractScrollArea.您应该创建QGraphicsView的自定义子类,并覆盖函数keyPressEvent().例:

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

         // Otherwise pass to the graphics view
         QGraphicsView::keyPressEvent(e)
    }
};
Run Code Online (Sandbox Code Playgroud)

然后,您将创建一个SnakeView对象,而不是创建QGraphicsView对象.

  • 在没有子类化的情况下执行此操作的另一种方法是安装事件过滤器.参见`QObject :: installEventFilter()`. (2认同)