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

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

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

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

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

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;
}
}

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

1

Решение

попробуйте использовать 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
}
0

Другие решения

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

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

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

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

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

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

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

0

Пожалуйста, используйте QTimeLine — это путь.

0
По вопросам рекламы [email protected]