Привет всем ... Столкнулся со следующей проблемой:
Использую QGraphicsView и установленную в него QGraphicsScene. На этой сцене есть QGraphicsItem которые я рисую в наследуюмом класе (прямоугольники залитые цветом и другие простые геометрические фигуры). И отдельно унаследован от того же QGraphicsItem еще один айтем, который рисуеться как картинка:
void Robot::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
painter->drawImage(0,0,QImage(":\\im\\C:\\Users\\Max_Payne\\Desktop\\Robott\\robot_2.png"));
}
Это скажем робот который должен обьезжать нарисованые другие фигуры. Задача сделать анимацию, тоесть плавное перемещение робота при движении. Двигаю я его так :
void Arthur::on_pushButton_2_clicked()
{
bool ok;
// размер шага , задаеться на форме в главном класе
int step = ui->lineEdit_sizeStep->text().toInt(&ok,10);
// количество шагов, тоже задаеться
int num_step = ui->lineEdit_lotStep->text().toInt(&ok,10);
//angle - это заданый угол
qreal x =(qreal)step*(qreal)cos(angle*M_PI/180);
qreal y =(qreal)step*(qreal)sin(angle*M_PI/180);
for (int t =0 ;t < num_step; t++)
{
robot->moveBy(x,y);
// этот сигнал приконекчен к слоту который рисует линию по точкам передаваемом в сигнале (траектория робота)
emit this->move_rob(robot->pos());
QEventLoop *loop=new QEventLoop;
ui->graphicsView->centerOn(robot);
QTimer *t=new QTimer;
t->start(1);
loop->connect(t,SIGNAL(timeout()),loop,SLOT(quit()));
loop->exec();
}
ui->graphicsView->centerOn(robot);
}
В этом случае анимация есть , но она зависит от времени выполнения цикла, и очень лагает, если делать еще чтото, например еще чтото считать.
Я попробовал сделать через QGraphicsItemAnimation:
void Arthur::on_pushButton_4_clicked()
{
bool ok;
int step = ui->lineEdit_sizeStep->text().toInt(&ok,10);
int num_step = ui->lineEdit_lotStep->text().toInt(&ok,10);
QTimeLine *timer = new QTimeLine(5000);
timer->setFrameRange(0, 100);
anRobot->setTimeLine(timer);
AnimR = robot->pos().toPoint();
qreal yy = AnimR.y();
qreal xx = AnimR.x();
for (int i = 0; i < (step*num_step); i++)
{
yy = yy+1.0*sin(angle*M_PI/180);
xx = xx+1.0*cos(angle*M_PI/180);
anRobot->setPosAt(i /(step*num_step*1.00), QPointF(AnimR));
ui->graphicsView->centerOn(robot);
AnimR.setX(xx);
AnimR.setY(yy);
emit this->move_rob(robot->pos());
ui->graphicsView->repaint();
ui->graphicsView->update();
sc->update();
}
timer->start();
}
В этом случае траекторию рисует только при повторном вызове метода, тоесть, предыдущий шаг рисует только при повторном нажатии на кнопку, последний шаг рисуеться с опозданием.
Подскажите что не так, и может кто знает как движение реализовать лучше. Например, через метод advance();
Я просто не понял как передавать туда значение угла и размера шага...
Заранее спасибо =)