【问题标题】:how to use `keyPressEvent` for animation in qt?如何在qt中使用`keyPressEvent`进行动画?
【发布时间】:2014-08-17 10:44:45
【问题描述】:

在这个程序中,我想在用户按下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;
    }
}

【问题讨论】:

    标签: qt keypress qgraphicsitem


    【解决方案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;
        }
    }
    

    很少有关于更改的 cmets: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-&gt;start(),然后才调用pr-&gt;setEndValue(),这会导致运行时错误,例如

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

    因为当你开始动画时不知道在哪里结束。通过这些更改,我可以毫无问题地在按键上触发动画。

    这有帮助吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-10
      • 2017-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多