如何在qt中使用`keyPressEvent`动画?

时间:2014-06-26 14:15:56

标签: qt keypress qgraphicsitem

在这个程序中,我想在用户按下Qt::Key_Right时为myqgraphicsobject的实例设置动画。在此代码中,我为QPixmap添加了QBrush作为QRectF。我写下面的代码,但它不起作用。我做错了什么?提前谢谢。

#include "myqgraphicsobject.h"
MyQgraphicsObject::MyQgraphicsObject(QGraphicsItem *parent) :
QGraphicsObject(parent)
{
}

void MyQgraphicsObject::paint(QPainter *painter, )
{
    QRectF rec(0,0,50,60);
    QPixmap pi(":picture/im/super.jpg");
    pi=pi.scaled(50,60);
    painter->setBrush(QBrush(pi));
    painter->setPen(Qt::NoPen);
    painter->drawRoundedRect(rec,10,10);
}

QRectF MyQgraphicsObject::boundingRect()const
{
    return QRectF(-1,-1,70,80);
}

class MainWindow : public QMainWindow
{
   Q_OBJECT 
   public:
     explicit MainWindow(QWidget *parent = 0);
     ~MainWindow();
   private:
     QGraphicsView* view;
     QGraphicsScene* scene;
     void keyPressEvent(QKeyEvent* k);
     void keyReleaseEvent(QKeyEvent* k);
     MyQgraphicsObject* m;
     QPropertyAnimation* pr;
     QElapsedTimer* timer;
};

MainWindow::MainWindow(QWidget *parent) :
  QMainWindow(parent)
{
    view=new QGraphicsView;
    scene=new QGraphicsScene;
    m=new MyQgraphicsObject;
    pr=new QPropertyAnimation(m,"pos");
    view->setScene(scene);
    view->resize(600,600);
    view->setFixedSize(600,600);
    setCentralWidget(view);
    scene->addItem(m);
    pr->setStartValue(QPoint(0,0));
    pr->setEasingCurve(QEasingCurve::InCirc);
}

void MainWindow::keyPressEvent(QKeyEvent *k)
{
    switch (k->key())
    {
      case Qt::Key_Right:
      {
          pr->start();
          //timer->start();
          QPoint p;
          p.setX(m->pos().x()+20);
          p.setY(0);
          pr->setEndValue(QPoint(p));
          pr->setDuration(1000);
          // pr->stop();
          qDebug()<<m->pos()<<endl;
          break;
      }
      default:
          break;
    }
}

void MainWindow::keyReleaseEvent(QKeyEvent *k)
{
    switch (k->key()) 
    {
      case Qt::Key_Left:
      {
          qDebug()<<"end"<<endl;
          break;
      }
      default:
          break;
    }
}

1 个答案:

答案 0 :(得分:1)

您没有提供有关哪个部分无法正常工作的任何详细信息,因此我已采用您的代码并尝试修复它以使其完成您想要的操作。

这是更改后的keyPressEvent方法

void MainWindow::keyPressEvent(QKeyEvent *k)
{
  QPointF p(0,0);
  switch (k->key())
    {
    case Qt::Key_Right:
      p = m->pos();
      p.setX(p.x() + 20.0);
      pr->setEndValue(p);
      pr->setDuration(1000);
      pr->start();
      break;
    default:
      break;
    }
}

对更改的评论很少:QPoint p更改为QPointF p以匹配QGraphicsObject::pos()的返回值。该定义移至case switch的外部以避免

jump to case label crosses initialization of QPoint p` 

错误(您可以查看此问题的已接受答案以获取详细信息Getting a bunch of crosses initialization error)。

另一个变化是,在您的代码中,您首先调用pr->start(),然后才调用pr->setEndValue(),这会导致运行时错误,例如

QPropertyAnimation::updateState (): starting an animation without end value 

因为当你开始动画时,我不知道在哪里结束。通过这些更改,我可以在键盘上触发动画而不会出现问题。

这有帮助吗?