简体   繁体   English

Qt抓住按键

[英]Qt catch pressed key

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. 但我想不出如何抓住按键来改变画线的方向。

在此输入图像描述

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();
}

QGraphicsView inherits from from QWidget because it inherits from QAbstractScrollArea. QGraphicsView继承自QWidget,因为它继承自QAbstractScrollArea。 You should create a custom subclass of QGraphicsView and just override the function keyPressEvent(). 您应该创建QGraphicsView的自定义子类,并覆盖函数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. 然后,您将创建一个SnakeView对象,而不是创建QGraphicsView对象。

QGraphicsView reimplements keyPressEvent and will forward events to the QGraphicsScene. QGraphicsView重新实现keyPressEvent并将事件转发到QGraphicsScene。 QGraphicsScene supports key presses through its keyPressEvent handler. QGraphicsScene通过其keyPressEvent处理程序支持按键。 By default the QGraphicsScene will forward that key press to the current QGraphicsItem through its keyPressEvent function. 默认情况下,QGraphicsScene会通过其keyPressEvent函数将该按键转发到当前的QGraphicsItem。

Given the above, what you likely want to do is reimplement the keyPressEvent handler in your QUpdatingPathItem : 鉴于上述情况,您可能想要做的是重新实现QUpdatingPathItemkeyPressEvent处理程序:

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. 我无法真正遵循你在advance方法中想要做的事情,所以我不能提供一些建议的处理程序。

Besides implementing QObject::installEventFilter , you could also subclass any of QGraphicsView, QGraphicsScene, or QGraphicsItem and override the keyPressEvent function. 除了实现QObject :: installEventFilter之外 ,您还可以继承 QGraphicsView,QGraphicsScene或QGraphicsItem中的任何一个并覆盖keyPressEvent函数。

thanks you all. 谢谢大家。 Then I didn't reach my aim. 然后我没有达到我的目标。 But time went on and I've come to the same problem and now I solved it. 但时间还在继续,我遇到了同样的问题,现在我解决了。

There are right and worth answers but then I wasn't good enough to put them together because no one was full and sufficient. 有正确和值得的答案,但后来我不够好,因为没有人充分和充分。 Now I did it so: 现在我这样做了:

HEADER FILE "header.h"
class MyGraphicView: public QGraphicsView
{
  Updating *m_update;
 public:
  MyGraphicView(Updating *update);
  void keyPressEvent(QKeyEvent *event);
};


#include "header.h"
void GraphicView::keyPressEvent(QKeyEvent *event)
 {
  switch ( event->key())
  {case Qt::Key_Up:
   m_update->move_up();
   break;

 case  Qt::Key_Down:
   m_update->move_down();
   break;

 case  Qt::Key_Left:
 {  m_update->move_right();
   break;
}
 case Qt::Key_Right:
 {  m_update->move_left();
   break;
}

} }

} }

Thanks again! 再次感谢!

Your choice of QGraphicsView isn't very fortunate. 您选择的QGraphicsView并不是很幸运。

Basically, when you are implementing some custom painted graphical item (the graphic area of the game is this), you should create your own widget and simply implement the QWidget::keyPressEvent() method. 基本上,当你实现一些自定义绘制的图形项目(游戏的图形区域是这个)时,你应该创建自己的小部件并简单地实现QWidget::keyPressEvent()方法。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM