Переместить изображение в QGraphicsView секунда в секунду

Я пытаюсь перемещать одно изображение в QGraphicsView каждую секунду, я пробовал четыре метода, но ни один из них не работал у меня.

1) Я использовал QTest, используя функцию QTest::qSleep(), но это вообще не сработало, потому что в приложении появляются две ошибки, я думаю, они должны быть с файлом .pro проекта.

2) Я использовал QThread во второй попытке, по крайней мере, QThread::sleep(), приложение запустилось, но изображение уже находится в последней позиции, которую я установил ранее. Я имею в виду, что сон не работает (работает несколько раз, но по-другому, после того, как цикл завершен и сон сработал внутри цикла, приложение несколько раз появляется на экране. Иногда зависает и не показывает приложение) .)

3) Я использовал одну функцию, которую пользователь опубликовал в другом вопросе, он сказал, что это альтернатива функции сна.

QTime dieTime= QTime::currentTime().addSecs(1);
while( QTime::currentTime() < dieTime )
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);

4) Я также использовал QWaitCondition, это один из вариантов, как и другой вариант.

QMutex dummy;
dummy.lock();
QWaitCondition waitCondition;
waitCondition.wait(&dummy, waitTime);

Я что-то читал про QTimer, но пока не умею им пользоваться, я новичок в QT, знаю только основы. Все, что я пробовал, я делал внутри цикла while.

Код, где мне нужно реализовать это:

void Window::start(PilaD *caminoGato,PilaD *caminoRaton){
 /*
 YOU DONT NEED TO UNDERSTAND THIS CODE
 Nodo *recorGato,*recorRaton;
 recorGato = new Nodo();
 recorRaton = new Nodo();
 recorGato = caminoGato->tope;
 recorRaton = caminoRaton->tope;
 By The Way, for you to understand, recorGato is a class, this class have two variable row and col
 */


 QPixmap *icon = new QPixmap(list.at(2));
 QGraphicsPixmapItem *gato = new QGraphicsPixmapItem(*icon);
 scene->addItem(gato);

 while(recorGato!=NULL){
    //ALL I TRIED, I PLACE IT HERE, INSIDE THE LOOP
    gato->setPos(recorGato->col*icon->width()+200,recorGato->row*icon->height()+100);
    recorGato = recorGato->pre;
 }
} 

Дело в том, что при каждом втором проходе изображение на кадре перемещается на следующую позицию, пока не достигнет предела, и перестает двигаться. Я не знаю, лучший ли способ сделать задержку, но мне нужно перемещать изображение каждую секунду, способ не имеет значения. Спасибо за чтение.


person vitaR    schedule 05.04.2014    source источник


Ответы (3)


попробуйте использовать QTimer со слотом. Я пишу только код sudo.

void MyClass::myFunc()
{
    mTimer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(slotMoveImage()));
    mTimer->start(1000); // set timeout for 1 second
 }


/***Slot will look something like this**/

void MyClass::slotMoveImage()
{
 // Move image and restart the timer. Do not restart if we don't want to move further
  img->setPos(img.rect().x() + 200, img.rect.y()+100);
  if(/* not some condition */)
     mTimer->start(1000); // again start the timer
}
person Shubham Gupta    schedule 05.04.2014

Немного сложно понять, почему некоторые части ваших предыдущих испытаний не сработали, поскольку вы не поделились подробностями.

Что касается использования QTimer, я бы прочитал об этом официальную документацию. . Это дает вам довольно хороший и, вероятно, самый авторитетный ответ.

Вот суть, встроенная для вашего удобства:

Пример таймера на одну секунду (1000 миллисекунд) (из примера с аналоговыми часами):

    QTimer *timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(update()));
    timer->start(1000);

С этого момента слот update() вызывается каждую секунду.

Это предоставит вам асинхронное (т. е. неблокирующее) решение, в отличие от предыдущих «спящих» операций. Таким образом, ваш код остается отзывчивым, в отличие от сна.

person lpapp    schedule 05.04.2014

Пожалуйста, используйте QTimeLine - это правильный путь.

person OnWhenReady    schedule 05.04.2014