IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

Faire un effet de "fondu" dans le background


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 217
    Par défaut Faire un effet de "fondu" dans le background
    Bonjour,

    Je suis entrain de faire une petite application pour découvrir les feuilles de style, la gestion de l'évènement paintEvent avec Qt.
    J'ai une MainWindow dérivée de QMainWindow qui contient en widget central un widget contenant un QTabWidget.

    J'aimerais faire une transition en "fondu" dans ma fenêtre principale entre les images d'arrières plan (chaque page de mon QTabWidget a sa propre image d'arrière plan) lorsque l'on change de page.
    Mais lorsque je change de page, ça ne ressemble pas du tout à un fondu: ça passe juste par le moment ou le fond est noir et le moment ou la nouvelle image est dessinée totalement opaque.

    J'ai essayé de régler le problème avec un QTimer réglé pour me faire un update toutes les 20ms, ou encore avec un update() suivi de processEvents() directement dans paintEvent (avec une boucle while bien crade) mais ça ne résout rien. Je vois pas ce qu'il faut faire, ni où, si vous pouviez m'éclairer ça serait sympa .

    Le paintEvent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    void MainWindow::paintEvent(QPaintEvent *event)
    {
        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing, true);
     
        painter.setBrush(QBrush(Qt::black, Qt::SolidPattern));
        painter.drawRect(0, 0, width(), height());
     
        QRectF imageRect(0, 0, width(), height());
     
        //timeElapsed représente le temps depuis le dernier changement de page
        if(timeElapsed.elapsed() < 2000)
        {
            //previousBackground est l'image de fond de la page précédente, elle est nulle si il n'y a pas de page précédente
            if(!previousBackground.isNull())
            {
            painter.setOpacity( 1.0f - timeElapsed.elapsed() /1000);
            painter.drawImage(imageRect, previousBackground);
            }
            painter.setOpacity( timeElapsed.elapsed() / 2000);
            //currentBackground est l'image de fond actuelle
            painter.drawImage(imageRect, currentBackground);
     
        }
     
        else
        {
            painter.setOpacity(1.0f);
            painter.drawImage(imageRect, currentBackground);
        }
    }

  2. #2
    Membre Expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Par défaut
    Salut,

    1. Dériver ton propre contrôle de QTabWidget
    2. Intercepter le clic pour éviter que le changement de page soit immédiat
    3. Faire un rendu vers QPixmap des 2 pages à mélanger
    4. Lancer 1 timer, et avoir une variable indiquant le pourcentage de fondu
    5. A chaque appel du timer, incrémenter le pourcentage, dessiner une pixmap correspondant au fondu dans le paintEvent; attendre jusqu'au prochain timeout
    6. Le %age de fondu est 100%, tu changes rééllement de page et tu laisses le paintEvent original du contrôle reprendre la main

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo