Partage
  • Partager sur Facebook
  • Partager sur Twitter

Qt pause non bloquante

Sujet résolu
    14 janvier 2021 à 13:06:30

    Bonjour. Je suis en train de créer une visionneuse d'images avec qt et je bloque sur la fonctionnalité diaporama.

    Je parcours le répertoire de l'image affichée et j'affiche toutes les images restantes dans le répertoire. J'utilise une boucle while mais la lecture étant trop rapide, on voit seulement la première et la dernière image. Avec QThread::sleep, seuls les noms des images sont affichés et je pense que c'est parce que le programme se bloque. J'aimerais savoir si il est possible d'allouer une durée pour la lecture des images.

    Code

    void ImageViewer::onDiapo()
    {
        QString tmpImageName;
        QDirIterator imgDirIterator{imageDirectory};
        while((imgDirIterator.hasNext()) && (QFileInfo(tmpImageName = imgDirIterator.next())).isFile())
        {
            QThread::sleep(TIME_TO_WAIT);
            readImage(tmpImageName);
        }
    }
    
    void ImageViewer::readImage(const QString &name)
    {
        if(name.isEmpty())
        {
            QMessageBox::warning(this,"Image","Nom invalide");
        }
        else
        {
            QImageReader reader(name);
            reader.setAutoTransform(true);
            img = reader.read();
            if (img.isNull())
            {
                QMessageBox::critical(this,"Image","Erreur lors de l'ouverture de l'image");
            }
            pixmap = QPixmap::fromImage(img);
            height = pixmap.height();
            width  = pixmap.width();
            imageLabel->setPixmap((QPixmap::fromImage(img)).scaled(height,width));
            imageLabel->setScaledContents(true);
            setWindowTitle(name);
        }
    }

    Merci d'avance pour vos réponses

    • Partager sur Facebook
    • Partager sur Twitter
      14 janvier 2021 à 14:15:41

      Il faut remplacer la boucle par une gestion d'événement à base de QTimer dont le but sera de déclencher la fonction readImage() le délai passé.

      • Partager sur Facebook
      • Partager sur Twitter
        14 janvier 2021 à 17:59:11

        Merci pour l'indication. Je pense avoir résolu le problème avec un QTimer et une QEventLoop

        Code :

        void ImageViewer::onDiapo()
        {
            QString tmpImageName;
            QDirIterator imgDirIterator{imageDirectory};
            QList<QString> imageList;
            while((imgDirIterator.hasNext()) && (QFileInfo(tmpImageName = imgDirIterator.next())).isFile())
            {
                imageList.push_back(tmpImageName);
            }
            foreach(auto tmp,imageList)
            {
                QTimer timer;
                QEventLoop loop;
                connect(&timer,&QTimer::timeout, &loop, &QEventLoop::quit);
                timer.start(TIME_TO_WAIT);
                readImage(tmp);
                loop.exec();
            }
        }


        • Partager sur Facebook
        • Partager sur Twitter

        Qt pause non bloquante

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown