Russian Qt Forum
Ноябрь 01, 2024, 12:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Анимация и движение QGraphicsItem  (Прочитано 6359 раз)
Max Payne
Гость
« : Апрель 05, 2011, 14:49 »

Привет всем ... Столкнулся со следующей проблемой:
Использую 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();
Я просто не понял как передавать туда значение угла и размера шага...
Заранее спасибо =)

Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Апрель 05, 2011, 14:52 »

Цитировать
painter->drawImage(0,0,QImage(":\\im\\C:\\Users\\Max_Payne\\Desktop\\Robott\\robot_2.png"));
Разве не видно, что проблема как минимум здесь?

потом
Код
C++ (Qt)
QEventLoop *loop=new QEventLoop;
QTimer *t=new QTimer;
Зачем аллокируешь в куче и не удаляешь?
Код
C++ (Qt)
t->start(1);
Какой смысл в задержке в 1 миллисекунду?

Чем не устроил QGraphicsPixmapItem? И коли завёл свой, то как реализован его boundingRect()?
« Последнее редактирование: Апрель 05, 2011, 15:02 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
Max Payne
Гость
« Ответ #2 : Апрель 05, 2011, 15:17 »

Точно, спасибо исправил ...
Реализовываю так область перерисовки:
Код:
QRectF Robot::boundingRect() const
{
    return (QRectF(QRect(0,0,128,128)));
}

Так как у меня картинка размера 128х128.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.131 секунд. Запросов: 22.