2014-04-05 4 views
1

매초 QGraphicsView에서 하나의 이미지를 이동하려고하는데 4 가지 방법을 시도했지만 그 중 아무 것도 작동하지 않았습니다.QGraphicsView에서 초당 이미지 이동

1) 나는 QTest :: qSleep() 함수를 사용하여 QTest를 사용했다. 그러나 이것은 전혀 작동하지 않았기 때문에 두 개의 오류가 응용 프로그램에 나타나기 때문에 프로젝트의 .pro 파일과 같아야한다고 생각한다.

2) 두 번째 시도 인 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; 
} 
} 

것은 제 2 패스, 프레임의 이미지, 그는 한계에 도달 할 때까지 다음 위치로 이동하고, 이동을 중지 할 때마다 그 . 지연을 만드는 것이 가장 좋은 방법인지는 모르지만 매초마다 이미지를 이동해야합니다. 길은 중요하지 않습니다. 읽어 주셔서 감사합니다.

답변

0

슬롯이있는 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을 사용하는 경우, 나는 그것에 대해 official documentation을 읽을 것입니다. 그것은 당신에게 꽤 좋은 그리고 아마도 가장 권위있는 대답을줍니다. 그로부터

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

: 한 초 (1000 밀리 초) 타이머

예 (아날로그 시계 예에서) : 여기서

편의를 위해 요지의 인라인 on으로 설정하면 매 초마다 update() 슬롯이 호출됩니다.

이렇게하면 이전의 "절전"작업과 반대되는 비동기 (즉, 비 차단) 솔루션이 제공됩니다. 이렇게하면 수면과 달리 코드가 응답 성이 유지됩니다.

0

QTimeLine을 사용하십시오 - 이것이 최선의 방법입니다.

관련 문제