在这个程序中,我想在用户按下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;
}
}
答案 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
因为当你开始动画时,我不知道在哪里结束。通过这些更改,我可以在键盘上触发动画而不会出现问题。
这有帮助吗?