Я пытаюсь переместить одно изображение в 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;
}
}
Дело в том, что при каждом втором проходе изображение на кадре перемещается в следующую позицию, пока он не достигнет предела, и перестает двигаться. Я не знаю, является ли задержка лучшим способом, но мне нужно перемещать изображение каждую секунду, путь не имеет значения. Спасибо за прочтение.
попробуйте использовать 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
}
Немного трудно понять, почему некоторые части ваших предыдущих испытаний не сработали, так как вы не поделились подробностями.
Что касается использования QTimer
Я бы прочитал официальная документация об этом. Это дает вам довольно хороший и, вероятно, самый авторитетный ответ.
Вот суть для вашего удобства:
Пример для таймера в одну секунду (1000 миллисекунд) (из примера аналоговых часов):
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(1000);
С этого момента слот update () вызывается каждую секунду.
Это предоставит вам асинхронное (то есть неблокирующее) решение в отличие от предыдущих операций «сна». Таким образом, ваш код остается отзывчивым в отличие от сна.
Пожалуйста, используйте QTimeLine — это путь.