但我无法想到如何抓住按键来改变画线的方向。
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();
}
答案 0 :(得分: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)
}
};
然后,您将创建一个SnakeView对象,而不是创建一个QGraphicsView对象。
答案 1 :(得分:4)
QGraphicsView重新实现keyPressEvent并将事件转发到QGraphicsScene。 QGraphicsScene通过其keyPressEvent处理程序支持按键操作。默认情况下,QGraphicsScene会通过其keyPressEvent函数将该按键转发到当前的QGraphicsItem。
鉴于上述情况,您可能要做的是重新实现keyPressEvent
中的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;
}
}
我无法真正遵循您在advance
方法中尝试做的事情,因此我无法提供建议的处理程序。
除了实现QObject::installEventFilter之外,您还可以对QGraphicsView,QGraphicsScene或QGraphicsItem中的任何一个进行子类化,并覆盖keyPressEvent函数。
答案 2 :(得分:0)
谢谢大家。然后我没有达到我的目标。但时间还在继续,我遇到了同样的问题,现在我解决了。
有正确和有价值的答案,但后来我还不够好,因为没有人充分和充分。现在我这样做了:
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;
}
}
}
再次感谢!
答案 3 :(得分:-1)
您选择QGraphicsView
并不是非常幸运。
基本上,当你实现一些自定义绘制的图形项目(游戏的图形区域是这个)时,你应该创建自己的小部件并简单地实现QWidget::keyPressEvent()
方法。