1

QGraphicsView で毎秒 1 つの画像を移動しようとしています。4 つの方法を試しましたが、どれもうまくいきませんでした。

1) 関数 QTest::qSleep() を使用して QTest を使用しましたが、これはまったく機能しませんでした。アプリケーションに 2 つのエラーが表示されました。プロジェクトの .pro ファイルに問題があると思われます。

2) 2 回目の試行で QThread::sleep() を使用して、少なくともアプリケーションを実行しましたが、イメージは既に前に設定した最後の位置にあります。つまり、スリープが機能していません (時々機能しますが、別の方法で、ループが完了し、ループ内でスリープが機能すると、アプリケーションが画面に表示されることがあります。時々、フリーズしてアプリを表示しません.)

3) 別の質問でユーザーが投稿した 1 つの機能を使用しました。彼は、Sleep 機能の代替であると述べました。

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

4) QWaitCondition も使用しました。これは、他のオプションと同様の 1 つの選択肢です。

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回通過するたびに、限界に達するまで次の位置に移動し、移動を停止することです。遅延させることが最善の方法かどうかはわかりませんが、毎秒画像を移動する必要があります。方法は問題ではありません。読んでくれてありがとう。

4

3 に答える 3

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
}
于 2014-04-05T04:15:06.427 に答える
0

QTimeLine を使用してください - これが進むべき道です。

于 2014-04-05T10:56:15.757 に答える